我使用单身如下:
// Foo.hpp
class Foo {
static Foo* instance() {
static Foo* foo = new Foo();
return foo;
}
}
现在,我的单例在第一次调用Foo :: instance()时被初始化。我想确保这是在main执行之前(我的代码是多线程的,我想在创建pThreads之前初始化所有单例)。
问题是:
有什么东西可以放在Foo.hpp中来实现上述目的吗? (我不想要一个通用的Globals.hpp taht初始化所有单例;我也更喜欢不必触摸Foo.cpp)。
谢谢!
答案 0 :(得分:2)
在Foo(private: static Foo singleton;
)中存储一个全局'Foo'实例并在某处定义它(最好是Foo.cpp,不幸的是需要触摸它)。这将在main()运行之前初始化对象 - 但是在多个单元中未定义静态初始化的顺序。
是什么让你无法做到这一点? :
int main() {
Foo::init();
bar::init();
LaunchAllMyThreads();
}
答案 1 :(得分:1)
您对单身人士的使用表明他们之间存在相互依赖关系。是这样的吗?此外,您不应该在堆上分配它;永远不会被摧毁。
class Foo {
static Foo& instance() {
static Foo foo; // no pointer needed
return foo;
}
};
无论如何,你要求的答案是添加这样的依赖:
class InitStons {
InitStons() {
Foo::instance();
}
} master_initialize;
但这不是一个好习惯,你应该在main()的开头初始化东西。
答案 2 :(得分:0)
在您的情况下,创建一个访问单例实例函数的全局或全局静态变量(指针)。
通常在编写单例时,虽然你会在类中放入一个静态变量,而不是指针。
答案 3 :(得分:0)
为什么不创建一个进入Foo.hpp的FooInit类?
class FooInit {
Foo* pFoo;
public:
FooInit() : pFoo(Foo::instance()) {}
~FooInit() {
if(pFoo)
delete pFoo;
}
};
在全球范围内初始化FooInit。
#include <Foo.hpp>
FooInit foo_init;
int main() {
// threads
// other stuff
}