2012-04-12 25 views
3

我只是在想,如果在編譯時可以使用新的C++ 11類內成員初始化程序來初始化單身人士,這可能是我的一些經理類的加速應用:在編譯時初始化單身人士

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' 

有沒有一種方法來初始化在編譯時與單身這種或其他的方法呢?

[我使用MacOSX10.7(和Ubuntu)GCC4.7與-std =的C++ 0x標誌集]

+6

這個類看起來不像一個單身... – jrok 2012-04-12 12:31:28

+4

除了不完整的類型問題,你如何期望在編譯時執行'operator new'的調用? – Job 2012-04-12 12:39:47

+0

@Job完全錯過了這一點。謝謝 – niktehpui 2012-04-12 12:48:17

回答

0
類的h文件構件

static CSingleton s_Instance; 

在.cpp文件在開始之後包含

CSingleton::s_Instance = CSingleton(); 

這是編譯時的初始化。 使用新的 - 這是運行時的初始化。形式上它們都是在編譯時初始化的。

+0

謝謝你,這正是我正在尋找的。不能相信我自己也沒有做到這一點...... – niktehpui 2012-04-12 12:41:41

+9

形式上,這是在程序啓動時初始化的,而不是編譯時。如果您使用靜態對象,那麼請注意[初始化命令失敗](http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.14)。 – 2012-04-12 12:43:11

+0

@Mike即使是'extern'物體也遭受了慘敗,不幸的是。只有裸數組初始化可以避免這些事情。 – rubenvb 2012-04-12 13:02:56