4

これは私がよく遭遇する問題です。次の例はそれを示しています。

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つの方法は、メンバーポインターを作成し、コンストラクター本体でそれらを初期化して、正しい順序を強制することですが、これはいくつかの理由で醜いです。コンストラクターの初期化リストを使用して、特定の初期化順序を強制する方法はありますか?そうでない場合は、これを処理する方法について他に提案がありますか。

4

1 に答える 1

12

初期化の順序が定義されていないため

それどころか、それは明確に定義されています。初期化の順序は、クラスでメンバー変数が宣言される順序と同じです(これは、初期化リストの実際の順序とは関係ありません。したがって、初期化リストの順序を宣言の順序と一致させることをお勧めします。厄介な驚きを避けてください)。

于 2010-02-11T10:25:57.000 に答える