我有以下课程:
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 对象之前构造 B 对象,但使用 A 对象这样做,这将在没有警告的情况下编译,但它会默默地输入一个错误:
class C
{
public:
C(): b(createB(a)), a(10) {}
private:
B b;
A a;
};
int main()
{
C c;
return 0;
}
当然,上面的例子是一个微不足道的例子,但我在现实世界中看到过它,代码要复杂得多(现在是星期五,晚上 8:30,我刚刚修复了这个导致段错误的错误)。
我怎样才能防止这种情况发生?