在C ++中,我有一个对象A
,它有一个接受istream
的构造函数(从文件加载自身)。我有另一个有A
成员的班级。我无法从初始化列表中调用A
的构造函数,因为我还没有打开istream
。一旦我在我的类的构造函数中打开它,就调用A
的构造函数为时已晚。有没有办法在初始化列表中打开istream
到一些临时对象,以便我可以将它发送到A
的构造函数?
如果有,是否有任何类型的保证在订单上调用初始化列表,以便istream
在A
之前初始化?
一个例子可能会有所帮助:
class A {
public:
A(std::istream const&);
}
class B {
public:
B(std::istream const&);
}
class MyClass {
A a;
B b;
public:
MyClass() : a(is), b(is) { // <-- How to do this?
std::istream is("path");
}
}
答案 0 :(得分:2)
使用指向对象的指针:
class MyClass {
A *a;
B *b;
public:
MyClass()
{
std::istream is("path");
a = new A(is);
b = new B(is);
}
}
不要忘记在析构函数中释放内存。
答案 1 :(得分:2)
由于两个成员都应该依赖于同一个istream,为什么不呢:
class A {
public:
A(std::istream const&);
}
class B {
public:
B(std::istream const&);
}
class MyClass {
A a;
B b;
public:
MyClass(std::istream const& is) : a(is), b(is) {
}
}
答案 2 :(得分:2)
这是另一个想法...如果您想避免动态分配并使用单个临时istream
,您可以将A
和B
的加载阶段从他们移开构造:
class A {
public:
Load(std::istream const&);
}
class B {
public:
Load(std::istream const&);
}
class MyClass {
A a;
B b;
public:
MyClass() {
std::istream is("path");
a.Load(is);
b.Load(is);
}
}
BTW要求A
和B
继承某个共享父级的加载能力,但这显然超出了这个问题的范围。
答案 3 :(得分:1)
也许我错过了什么,但问题是:
class MyClass {
A* a;
B* b;
public:
MyClass() {
std::istream is("path");
a = new A(is);
b = new B(is);
}
~MyClass() {
delete a;
delete b;
}
}
答案 4 :(得分:1)
类的成员变量的初始化将按照您在类声明中指定的顺序进行。
请注意,当初始化列表中的顺序与成员变量的声明顺序不对应时,gcc将发出警告(给定-Wall)。该类中的声明顺序具有权威性。
class A { public: A(std::istream const&); } class B { public: B(std::istream const&); } class MyClass { std::istream is; A a; B b; public: MyClass() : is("path"), a(is), b(is) { } }