Вы помещаете свой статический экземпляр в "main.cpp
", так что кажется, что он должен был работать (так как до "main()
" нет двусмысленности в построении).
Однако ябыли аналогичные проблемы статических экземпляров через границы DLL или когда синглеты ссылаются на другие синглеты (A
может ссылаться на B
после выделения B
, но до вызова конструктора B::B()
).В таких случаях разумный обходной путь (который должен также работать на вас) явно вызывает инстанцирование:
//SomeClass my_singleton; // OLD, NOW INSTANTIATE EXPLICITLY
SomeClass& GetSomeClassSingleton(void) {
static SomeClass my_singleton; // Instantiate once, explicitly
return my_singleton;
}
В некоторых случаях вы можете захотеть создать «несколько динамически»:
SomeClass& GetSomeClassSingleton(void) {
static SomeClass* my_singleton = NULL;
if(!my_singleton) {
my_singleton = new SomeClass();
}
return *my_singleton;
}
Конечно, подходы работают отлично даже в том случае, если вам нужно передать параметры конструктору вашего синглтона.
Удачи, и дайте нам знать, если у вас это получитсяна Android (я действительно хочу знать, что там работает).Я полагаю, что загрузка процессов Android представляет собой проблему, аналогичную границам синглетонов через DLL, и в таких случаях я использую приведенные выше шаблоны для синглетонов.