前一段时间,我用一组嵌套类编写了一些代码。今天看看它,我想知道为什么它编译时,我实例化类型的对象C.这段代码为什么编译时不会抱怨构造函数?
我的困惑是这样的。 B有一个私人构造函数。这个构造函数的实现关心A的构造,但是A的构造需要B的一个实例。我觉得它是一个鸡和鸡蛋的场景。 B的建设需要建造A,这需要建造B等等。
我有以下的类 - 剥离右后卫演示问题:
// ******* A ******** //
class A {
public:
A(A& _Parent, int id);
private:
A& Parent;
};
inline A::A(A& _Parent, int id)
: Parent(_Parent)
{
}
// ******* B ******** //
class B:public A {
public:
static B& GetInstance();
private:
B();
};
inline B::B()
: A(B::GetInstance(), 0)
{
}
inline B& B::GetInstance()
{
static B b;
return b;
}
// ******* C ******** //
class C:public A {
public:
C();
};
inline C::C()
: A(B::GetInstance(), 0)
{
}
是的。我认为这是不确定的行为,但像大多数编译器实现静态函数/内部范围对象的建设,这滑过裂缝,实际工作... –
注:也许这只是你的样品中存在的问题,而不是真实的代码;但是会导致未定义行为将静态对象放入内联函数中(因为静态对象对于不同的翻译单元将不同,但内联函数对于所有单元必须相同)。希望在真正的代码中,'B :: GetInstance()'没有在头文件中实现。作为一个经验法则,尽量避免提及任何静态对象的内联函数 –
有了'gcc'这也引发运行时异常[__gnu_cxx :: recursive_init_error(https://gcc.gnu.org/onlinedocs/gcc- 4.6.3 /的libstdC++/API/a00064.html)。所以即使这个问题没有在编译时被捕获,初始化也会失败。 – Jonesinator