初期化子リストを使用して次のようなことに何度か遭遇しましたが、うまく説明できませんでした。以下が正確に失敗する理由を誰でも説明できますか (タイプミスをキャッチするコンパイラがないので、ご容赦ください)。
class Foo
{
public:
Foo( int i ) : m_i( i ) {} //works with no problem
int getInt() {return m_i;}
~Foo() {}
private:
int m_i;
};
class Bar
{
public:
Bar() :
m_foo( 5 ), //this is ok
m_myInt( m_foo.getInt() ) //runtime error, seg 11
{}
~Bar() {}
private:
Foo m_foo;
int m_myInt;
};
初期化子リストの上位で初期化されたメンバーのメンバー関数を呼び出そうとすると、seg fault が発生します。これは既知の問題 (またはおそらく設計によるもの) であることを思い出すようですが、よく説明されているのを見たことがありません。添付の例は単純な古いデータ型で作成されBar::m_myInt
ていますが、デフォルト (空の) コンストラクターを持たない別のオブジェクトに置き換えると、問題はより現実的になります。誰でも私を啓発できますか?