[英]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.