2011-04-05 37 views
2

我有一個singlton的問題。單身的靜態可變位置

我應該在哪裏聲明單例類的靜態成員?

爲什麼不這樣工作

class singleton{ 

    private: 

    static singleton & m_singleton; 

    public: 

    static singleton& get_instance{ 

      return m_singleton; 
    } 

} 

,但我必須這樣

class singleton{ 

    public: 

    static singleton& get_instance{ 

    static singleton & m_singleton; 

      return m_singleton; 
    } 

} 

有什麼差異性?

我知道有另一種方法來使用指針,但現在我只是在談論使用一個對象的情況。

另外還有一個問題,單身人士使用指針和引用有什麼優點/缺點?

非常感謝!

+0

更多的信息在這裏:http://stackoverflow.com/questions/1008019/c-singleton-design-pattern/1008289#1008289 – 2011-04-05 23:20:57

回答

5

在第一種情況下,當程序初始化時,在調用main()之前,構造單例(稱爲構造函數)。在這種情況下,您還需要在cpp文件中的某處定義靜態變量。

在第二種情況下,首次調用函數時構造單例。請注意,由於函數中的靜態變量初始化不是線程安全的,因此此實現不是線程安全的。如果兩個線程都是第一次調用這個函數,那麼您很可能會得到兩個單例。

另請注意,您有第二個錯誤。沒有初始化就無法定義參考。這

static SomeClass &var; 

不編譯。您需要刪除引用來創建類的實際實例,而不是引用,然後返回對其的引用。

如果在第二個示例中將靜態變量定義爲指針,則可以通過仔細初始化指針來避免我提到的線程問題。閱讀更多關於它在this class article(那談論Java,但核心問題是相同的)

+0

+1:一般同意。但是如果你將它改爲指針,你會遇到破壞單例的問題。只需在需要它的平臺(即不是gcc)上創建單例時添加鎖就容易多了。 – 2011-04-05 23:19:59