Принудительная инициализация синглтона в c ++ перед main () - PullRequest
2 голосов
/ 22 февраля 2010

Я использую синглтоны следующим образом:

// Foo.hpp
class Foo {
  static Foo* instance() {
    static Foo* foo = new Foo();
    return foo;
  }
}

Теперь мой синглтон инициализируется при первом вызове Foo :: instance (). Я хочу убедиться, что это перед выполнением main (мой код многопоточный, я хочу, чтобы все синглеты были инициализированы до создания pThreads).

Вопрос:

Могу ли я что-нибудь добавить в Foo.hpp, чтобы вышеперечисленное произошло? (Я не хочу, чтобы универсальный Globals.hpp инициализировал все синглтоны; я также предпочел бы не трогать Foo.cpp).

Спасибо!

Ответы [ 4 ]

2 голосов
/ 22 февраля 2010

Сохраните глобальный экземпляр 'Foo' в Foo (private: static Foo singleton;) и определите его где-нибудь (предпочтительно, Foo.cpp, к которому, к сожалению, нужно прикасаться). Это инициализирует объект перед выполнением main (), но порядок статической инициализации не определен для нескольких модулей.

Что мешает тебе это сделать? :

int main() {

   Foo::init(); 
   bar::init();

   LaunchAllMyThreads();
}
1 голос
/ 22 февраля 2010

Использование синглетонов указывает на взаимозависимость между ними. Это тот случай? Кроме того, вы не должны размещать его в куче; оно никогда не будет уничтожено.

class Foo {
  static Foo& instance() {
    static Foo foo; // no pointer needed
    return foo;
  }
};

В любом случае, вы просите добавить такую ​​зависимость:

class InitStons {
  InitStons() {
    Foo::instance();
  }
} master_initialize;

Но на самом деле это не очень хорошая практика, и вы должны просто инициализировать вещи в начале main ().

0 голосов
/ 22 февраля 2010

Почему бы не создать класс FooInit, который входит в ваш Foo.hpp?

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
}
0 голосов
/ 22 февраля 2010

В вашем случае создайте глобальную или глобальную статическую переменную (указатель), которая обращается к вашей функции экземпляра синглтона.

Обычно, когда вы кодируете одиночный код, вы помещаете в класс статическую переменную, а не указатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...