あなたの親は参照セットの時間に構築されていないので、それは悲惨なことがあります。次の例はこれを示しています。
#include <iostream>
using namespace std;
struct TheParent;
struct TheChild
{
TheChild(TheParent& parent);
TheParent& myParent;
};
struct TheParent
{
TheParent()
: mychild(*this)
, value(1)
{
cout << "TheParent::TheParent() : " << value << endl;
}
TheChild mychild;
int value;
};
TheChild::TheChild(TheParent& parent)
: myParent(parent)
{
cout << "TheChild::TheChild() : " << myParent.value << endl;
};
int main()
{
TheParent parent;
return 0;
}
次の出力を生成し、親オブジェクトの不確定な状態を明確に示します。
TheChild::TheChild() : 1606422622
TheParent::TheParent() : 1
結論:このようにしないでください。代わりに動的な子の割り当てを使用する方が適切ですが、これにも注意が必要です。
#include <iostream>
using namespace std;
struct TheParent;
struct TheChild
{
TheChild(TheParent& parent);
TheParent& myParent;
};
struct TheParent
{
TheParent()
: mychild(NULL)
, value(1)
{
mychild = new TheChild(*this);
cout << "TheParent::TheParent() : " << value << endl;
}
~TheParent()
{
delete mychild;
}
TheChild* mychild;
int value;
};
TheChild::TheChild(TheParent& parent)
: myParent(parent)
{
cout << "TheChild::TheChild() : " << myParent.value << endl;
};
int main()
{
TheParent parent;
return 0;
}
これにより、あなたが望んでいる可能性が高いものが得られます。
TheChild::TheChild() : 1
TheParent::TheParent() : 1
ただし、がTheParent
継承チェーンの中間クラスであり、まだ構築されていない派生クラスの関数のオーバーライドされる可能性のある仮想実装にアクセスしたい場合は、これでも問題が発生することに注意してください。
繰り返しになりますが、これを実行していることに気付いた場合は、そもそもなぜそうする必要があるのかを考えたいと思うかもしれません。