次のクラスがあります。
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;
};
そして、オブジェクト A をパラメーターとして取り、オブジェクト B を作成する関数:
B
createB(const A& a) {
std::cout<<"a int: "<<a.x<<"\n";
return B();
}
タイプ A と B のメンバーを持ち、A オブジェクトを作成する前に B オブジェクトを作成するクラス C を設計すると、A オブジェクトを使用してそのようにすると、警告なしでコンパイルされますが、暗黙のうちにバグが発生します。
class C
{
public:
C(): b(createB(a)), a(10) {}
private:
B b;
A a;
};
int main()
{
C c;
return 0;
}
もちろん、上記の例は些細な例ですが、実際にはもっと複雑なコードで見たことがあります (金曜日の午後 8 時 30 分で、segfault につながるこのバグを修正したところです)。
どうすればこれを防ぐことができますか?