我有
class Foo
class Bar
Now, I want
Foo* Foo::singleton = new Foo();
Bar* Bar::singleton = new Bar();
在进行初始化之前,需要执行以下操作:
int main()
被称为。
此外,我希望
Foo::singleton
在初始化之前
Bar::singleton
有什么方法可以确保这一点吗?
谢谢!
我有
class Foo
class Bar
Now, I want
Foo* Foo::singleton = new Foo();
Bar* Bar::singleton = new Bar();
在进行初始化之前,需要执行以下操作:
int main()
被称为。
此外,我希望
Foo::singleton
在初始化之前
Bar::singleton
在同一翻译单元中定义的全局变量(如单例)按照定义顺序进行初始化。因此,请将两个单例的定义放在同一个源文件中,并按正确顺序进行。
如果它们在不同的源文件中定义,则初始化顺序是未指定的(即“静态初始化顺序惨案”)。
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
...
}
记住,离开程序时单例模式也会变得非常混乱,因此明确声明会更好。
// 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;
}
#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()