在另一个构造函数中实例化的对象的构造函数内调用一个函数

时间:2012-01-20 09:23:37

标签: c++

#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类尚未完全构建。

我已将此代码投入生产。应用程序似乎在启动时随机崩溃,我想知道这是否可能是由于这种“糟糕”的设计。

2 个答案:

答案 0 :(得分:5)

明确声明为 Undefined Behavior :(§6.7/ 4)“如果控件在初始化变量时递归地重新输入声明,则行为未定义。”

答案 1 :(得分:1)

  

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

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

出现问题

在完全构建C staticA)之前,您初始化a的实例。然后在a的构造函数中引用C。由于未构造a,您可以*进入递归循环。

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