2012-09-03 76 views
0

假設我們有一些使用extern關鍵字的外部鏈接。extern vs Singleton class

我有(在class1.cpp):

MyClass* myClassVar = NULL; 

構造函數初始化以上,和析構函數刪除。

然後在class2.cpp和class3.cpp有:

extern MyClass* myClassVar; 

這些類使用myClassVar(做通常的null檢查等)。

Singleton會被首選嗎? (我知道globals是壞的,而Singleton只是語法糖)。將上面的代碼更改爲以下代碼是否有優勢?

static Singleton& getInstance() 
{ 
    static Singleton instance; 

    return instance; 
} 

然後,所有的類就可以了:

Singleton::getInstance() 

回答

6

全局變量遭受初始化命令失敗。單獨翻譯單元中的全局變量將以未指定的順序進行初始化,因此如果在構造函數中引用另一個變量,則會導致未定義的行爲。

第一次調用函數時,初始化函數範圍內的靜態變量,這或多或少地解決了初始化順序問題。

但是,更微妙的問題仍然存在;特別是,在對象被銷燬之後仍然可以訪問對象,並且確保線程安全初始化有一些開銷(並且在較早的編譯器中,初始化可能根本不是線程安全的)。有沒有完全安全的方式來管理非平凡類型的全球可訪問的對象,我的建議是儘可能避免它們。

+0

+1這確實是真正的優勢。 –

4

既然你說你已經知道的任何類型的全局中的挫折,唯一的好處是,你限制類的實例爲1,反對使用extern,您可以在其中定義多種此類變量。

+0

你不能真正定義多個具有相同名稱的變量,所以差異不成立。 –

+0

@Als我從來沒有說過他們有相同的名字。單身人士完全不允許這樣做(即使名稱不同)。 –

+0

@LuchianGrigore不完全正確。至少不是在實際意義上。沒有什麼能夠阻止你讓單身人士成爲一個對象數組而不是一個單一的對象:)儘管這首先擊敗了單身人士的想法。 – s3rius