C++ では、その所有者を指すオブジェクトへの参照がありますが、構築が完了していないため、含まれているクラスの構築中にポインターを設定できません。
ポインタは問題なく格納できます。
親インスタンスがその時点で完全に初期化されていない可能性があるため、できないことは、B のコンストラクターのポインターを介して A のメンバー/メソッドにアクセスしようとすることです。
#include <iostream>
class Y;
class X
{
Y* y;
public:
X(Y* y);
};
class Y
{
X x;
int n;
public:
Y(): x(this), n(42) {}
int get_n() const { return n; }
};
X::X(Y* p): y(p)
{
//Now this is illegal:
//as it is, the n member has not been initialized yet for parent
//and hence get_n will return garbage
std::cout << p->get_n() << '\n';
}
int main()
{
Y y;
}
Y のメンバーを切り替えると、n が最初に初期化されるため、X のコンストラクターは 42 を出力しますが、これは脆弱すぎて依存できません。