繁体   English   中英

c ++单例初始化顺序

[英]c++ singleton initialization order

我有

class Foo
class Bar

现在,我想要

Foo* Foo::singleton = new Foo();
Bar* Bar::singleton = new Bar();

两者都在之前初始化

int main()

叫做。

而且,我想要

Foo::singleton

之前初始化

Bar::singleton

无论如何我能确保吗?

谢谢!

在同一翻译单元中定义的全局变量(如单例)按照定义它们的顺序进行初始化。 因此,以正确的顺序将两个单例的定义放在同一个源文件中。

如果它们将在不同的源文件中定义,则它们的初始化顺序将是未指定的(“ 静态初始化顺序失败 ”)。

另请参见静态变量初始化顺序

对于gcc,使用init_priority:

http://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Attributes.html

适用于不同的翻译单位。 所以你的代码会读到:

Foo* Foo::singleton __attribute__ ((init_priority (2000))) = new Foo();
Bar* Bar::singleton __attribute__ ((init_priority (3000))) = new Bar();

我现在没有gcc方便,所以我无法验证这一点,但我之前使用过它。 另一个更简单,更便携的解决方案是避免静态初始化,并在main中的某个明确定义的位置显式创建单例。

// Nothing in static area

void main(void)
{
  // Init singletons in explicit order
  {
    Foo* Foo::singleton = new Foo();
    Bar* Bar::singleton = new Bar();
  }

  // Start program execution
  ...
}

请记住,在离开程序的过程中,单身人士的事情也会变得越来越粗糙,所以通常更好地使它明确。

#include <iostream>

class Foo {
public:
  static Foo *singleton ()
  {
    if (foo == NULL)
      foo = new Foo;
    return foo;
  }
private:
  Foo ()
  {
    std::cout << "Foo()\n";
  }
  static Foo *foo;
};

Foo *Foo::foo = NULL;

Foo *singleton = Foo::singleton ();

int
main ()
{
  std::cout << "main()\n";
  return 0;
}

输出:

Foo()
main()

简而言之:

// smooth.cpp
#include "foo.h"
#include "bar.h"

Foo* Foo::singleton = new Foo();
Bar* Bar::singleton = new Bar();

一个很好的语法,以避免担心:

Foo& Foo::singleton()
{
  static Foo Singleton;
  return Singleton;
}

关于这种语法的好处是,单例在方法的第一次调用时被初始化,因此你不必担心(通常)它何时发生,因为当调用方法来访问它时你无论如何都得到它:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM