这可能是灾难性的,因为您的父母不是在参考集的时间构建的。下面的例子将证明这一点:
#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
但是请注意,如果它是继承链中的中间类,并且您希望访问尚未构建的派生类中可能被覆盖的函数的虚拟实现,那么即使这样也会有问题。
同样,底线是,如果您发现自己这样做,您可能想首先考虑为什么需要这样做。