在main()之前强制在c ++中初始化singleton

时间:2010-02-21 23:25:49

标签: c++ singleton

我使用单身如下:

// 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)。

谢谢!

4 个答案:

答案 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
}