これは私がよく遭遇する問題です。次の例はそれを示しています。
struct A {
int m_SomeNumber;
};
struct B {
B( A & RequiredObject );
private:
A & m_RequiredObject;
};
struct C {
C( );
private:
A m_ObjectA;
B m_ObjectB;
};
のコンストラクターの実装は次のC
ようになります。
C::C( )
: B( m_ObjectA )
{ }
初期化の順序が定義されていないためm_ObjectA
、のコンストラクターm_ObjectB
が呼び出されたときに初期化されない可能性があり、未定義の動作が発生します。初期化の特定の順序を強制する1つの方法は、メンバーポインターを作成し、コンストラクター本体でそれらを初期化して、正しい順序を強制することですが、これはいくつかの理由で醜いです。コンストラクターの初期化リストを使用して、特定の初期化順序を強制する方法はありますか?そうでない場合は、これを処理する方法について他に提案がありますか。