2012-01-20 112 views
0
#include <iostream> 
struct D{}; 
struct B{}; 

struct C 
{ 
    C(); 
}; 

struct A 
{ 
    A(); 
    B * b; 
    C * c; 
    D * d; 

    static A& pInstance() 
    { 
     static A a; 
     return a; 
    } 
}; 


A::A() 
{ 
    b = new B; 
    c = new C; 
    d = new D; 
} 

C::C() 
{ 
    A::pInstance().b; 
} 

int main() 
{ 
    A::pInstance(); 

    std::cin.ignore(); 

} 

上述情况是否存在潜在的问题,因为C构造函数调用A字段,而A类尚未完全构造。在另一个构造函数中实例化的对象的构造函数中调用函数

我在生产这个代码。应用程序似乎在开始时随机崩溃,我想知道这是否可以归因于这种“差”设计。

+0

如果第一行是'static A&A :: pInstance()',或者2个调用有额外的'A ::'? – kkm

+0

当你输入构造函数时,这个类已经完全构造了。 –

+0

这样的问题需要一个完整的例子来正确回答。请包括所需的声明/定义。 –

回答

5

它明确表明其未定义行为:(§6.7/4)“如果控制重新进入递归而可变被初始化的声明,该行为是未定义”

+0

+1:谢谢。我没有交标准。 – Johnsyweb

+0

+1:完全正确! – Chubsdad

+0

@ MSalters:非常感谢。 – Guillaume07

1

[是否]上述情况可能存在任何问题,因为C构造函数调用A字段,而A类尚未完全构造。

是的。这可能会导致您的问题the behaviour is undefined...

您在staticAa)完全建立之前,初始化的C一个实例。 a然后在C的构造函数中引用。由于a未被构建,因此您可以输入递归循环*

This is what happens when you build this with g++.

+0

好的,谢谢,我会测试另一个设计,看看bug是否消失(例如5天没有崩溃)。我在windows下使用MSVC2010编译器。 – Guillaume07

相关问题