#include <iostream>
class BarParent
{
public:
int x;
virtual void fuz() = 0;
};
class BarChild : public BarParent
{
public:
BarChild(int new_x){x = new_x;}
virtual void fuz(){}
};
class FooParent
{
public:
BarParent* p_barPar;
FooParent (BarChild* new_p_bar)
{
p_barPar = new_p_bar;
std::cout << p_barPar->x << std::endl;
}
};
class FooChild: public FooParent
{
public:
BarChild barChild;
FooChild(int new_x):FooParent(&barChild), barChild(new_x){}
};
int main()
{
FooChild foo(60);
BarChild bar(99);
FooParent fooP(&bar);
}
输出:
-548726160
99
我理解为什么我得到这个结果(未定义的行为),在初始化之前先使用
barChild
。我的问题是处理此问题的“权利”是什么。 最佳答案
在这种情况下,需要固定设计而不是代码。
根据您自己的设计:BarChild
必须在FooParent
之前构造。FooParent
必须在FooChild
之前构造。FooChild
必须在BarChild
之前构造。
当您希望FooParent
和FooChild
都引用相同的Bar对象时(如在代码中尝试的那样),请设计父类来管理它。
一种示例解决方案:
FooParent (BarChild* new_p_bar)
{
if ( new_p_bar == NULL )
new_p_bar = new BarChild;
p_barPar = new_p_bar;
std::cout << p_barPar->x << std::endl;
}
在这里,
FooChild
不需要它自己的该对象实例。