2012-04-12 5 views
3

Я просто думал, что новые инициализаторы элементов C++ 11 в классе могут использоваться для инициализации Singletons во время компиляции, что может быть ускорением для некоторых классов Manager в моем приложения:Инициализация синглтона во время компиляции

class CSingleton 
{ 
public: 
    CSingleton(void) {} 
    ~CSingleton(void) {} 
    static const CSingleton* GetInstance(void) 
    { 
     return Instance; 
    } 

    bool Foo1(int x); 
    bool Foo2(int y); 
private: 
    static constexpr CSingleton *Instance = new CSingleton(); 
} 

проблема заключается в это приводит к следующим ошибкам:

Line of Instance declaration: error: invalid use of incomplete type 'class test::CSingleton' 
First Line of class declaration: error: forward declaration of 'class test::CSingleton' 

есть ли способ инициализации синглтонов во время компиляции с тем или другим подходом?

[Я использую GCC4.7 на MacOSX10.7 (и Ubuntu) с -std = C++ 0x флаг установлен]

+6

Этот класс не очень похож на одноэлементный ... – jrok

+4

Помимо проблемы с незавершенным типом, как вы ожидаете, что вызов 'operator new' будет выполнен во время компиляции? – Job

+0

@Job полностью пропустил эту точку. спасибо – niktehpui

ответ

0

в .h файле члена класса:

static CSingleton s_Instance; 

в .cpp-файл в начале справа включает

CSingleton::s_Instance = CSingleton(); 

Это инициализация во время компиляции. с использованием нового - это инициализация во время выполнения. Формально обе они инициализируются во время компиляции.

+0

Спасибо, что я искал. Не могу поверить, что мне не удалось это сделать ... – niktehpui

+9

Формально это инициализируется при запуске программы, а не времени компиляции. Если вы используете статические объекты, то остерегайтесь [фиаско порядка инициализации] (http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.14). –

+0

@Mike даже объекты 'extern' страдают от этого фиаско, к сожалению. Инициализация только с открытым массивом может избежать этого. – rubenvb

Смежные вопросы