构造函数之前调用的静态对象和成员方法

时间:2012-10-04 10:03:16

标签: c++ static constructor

我有两个类A和B,这样A有一个静态B实例作为其成员。 B有一个函数Show(),这里是我的A类:

class A
{
  A()
  {
    _b.Show();
  }
private:

  static B _b; 
};

以后的代码是

A a;
B A::_b;

int main()
{
}

由于我定义的序列,现在在构造B之前调用B :: Show() a和_b。但是,这是如何工作的,即如何对仍未构造的对象进行调用?

3 个答案:

答案 0 :(得分:4)

这是不可能的,它是未定义的行为(在这种情况下,因为您正在访问未初始化的对象),因为aA::_b之前被初始化。

查找静态初始化顺序fiasco 。您没有收到错误,因为99%的情况发生这种情况,它不容易被诊断出来。

答案 1 :(得分:2)

这是静态初始化顺序问题。在一般情况下难以解决,但修复某些情况的一种方法是将依赖项放在这样的函数中:

class A
{
public:
    A()
    {
        getB().Show();
    }
private:
    static B& getB()
    {
        static B b;
        return b;
    }
};

函数中的静态保证在第一次调用时初始化。此外,在C ++ 11中,这也保证了线程安全。

进一步阅读:

http://www.parashift.com/c++-faq/static-init-order-on-first-use.html

Finding C++ static initialization order problems

答案 2 :(得分:0)

  

如何才能对仍然没有的对象进行调用   构造

嗯,简单的答案就是代码完成它的方式。 <g>。在同一翻译单元中的文件范围中定义的对象按其定义发生的顺序构造,因此如果一个对象的构造函数依赖于另一个对象,则必须确保在构造函数的构造函数中已经构造了第二个对象。第一个对象运行。

C ++在这里没有提供任何帮助;你必须自己跟踪它。