親がリファレンスセットの時間を構成していないので、悲惨なことがあります。
TheChild::TheChild() : 1606422622
TheParent::TheParent() : 1
ボトムライン:
#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;
}
は明らかに親オブジェクトの不確定な状態に注意して、次の出力を生成します。次の例では、このことを実証する、このようにそれをしません。あなたは良いだろう代わりに、動的子割り当てを使用するように役立ったが、それでもこれは警告があります:
#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
が継承チェーンの中間クラスであり、まだ構築されていない派生クラスの関数の潜在的にオーバーライドされた仮想実装にアクセスすることを望んでいる場合、これにも問題があります。
もう一度、あなたがこれをやっていることが分かったら、なぜ最初に必要なのか考えてみてください。
'* this'ではなく' this'を意味するのでしょうか? –
_is_が悪いので、イニシャライザリストで 'this'を使うためのコンパイラ警告(少なくとも)が必要です。しかし、私はこれをたくさん見ていますし、単純な意味で(修正を除いて)それを「修正」する良い方法を考えることはできません。 – Chad
それは意味があるので、refをとる。 Btwはイニシャライザリストにあることを無視します...それはctorボディ内にあると言うことができます。 – NoSenseEtAl