我有以下课程:
class A
{
public:
A() { x = 0; std::cout<<"A default ctor()\n"; }
A(int x_) { x = x_; std::cout<<"A normal ctor()\n"; }
int x;
};
class B
{
public:
B() { std::cout<<"B ctor()\n"; }
private:
std::string str;
};
以及创建对象B的函数,将对象A作为参数:
B
createB(const A& a) {
std::cout<<"a int: "<<a.x<<"\n";
return B();
}
如果我设计一个类C,它具有类型A和B的成员并在构造A-object之前构造B对象但使用A对象这样做,这将编译而没有警告但它将默默地输入错误:
class C
{
public:
C(): b(createB(a)), a(10) {}
private:
B b;
A a;
};
int main()
{
C c;
return 0;
}
当然,上面的例子是一个微不足道的例子,但我在现实世界中看到它,在更复杂的代码中(它是星期五,晚上8:30,我刚刚解决了这个导致段错误的错误).
我怎样才能防止这种情况发生?
最佳答案 我同意其他人的建议,即设计师有责任确保在使用前初始化对象.在你的情况下,我看到两种方法:
首先(也是最简单的),颠倒类定义中a和b的顺序:
class C
{
public:
C(): b(createB(a)), a(10) {}
private:
A a;
B b;
};
其次,如果你想真正强调它的初始化发生在其他成员之前,你可以将a移动到基类:
class CBase
{
protected:
CBase(): a(10) {}
protected:
A a;
};
class C : private CBase
{
public:
C(): b(createB(a)) {}
private:
B b;
};