2011-06-17 21 views
1

我相信這可能已經回答,但我實際上找不到合併的答案。這個單身人士的問題(不是課程)

以下單例的問題,只是一個函數,並保證有初始化,並假設T支持operator!,需要的構造函數,函數等? (我沒有尋找線程安全)。更重要的是,在我的情況下,其他人創建T對象的行爲是我想要用於我的程序生命週期的數據庫句柄。

template<typename T> 
T* getInstance(){ 
    static T instance; 
    if (!instance && !instance.initialize()){ 
     return NULL; 
    } 
    else { 
     return &instance; 
    } 
} 
+0

它不是線程安全的......這是錯的。 –

+0

這樣做的主要問題是您嘗試使用Singleton。辛格爾頓是一種反模式。 [不要使用它]。(http://jalf.dk/blog/2010/03/singletons-solving-problems-you-didnt-know-you-never-had-since-1995/) – sbi

回答

1

你的代碼有一些錯誤 - 模板類型被用來代替變量。

爲了您的需要(不必關心線程安全&在整個應用程序中都需要它),它可能正是您所需要的。您可能希望從此開始:

template<typename T> T* getInstance() 
{ 
    static T instance; 
    return &instance; 
} 
+0

謝謝,編輯了正確使用的代碼。對我來說問題是對象構造可能不一定會初始化。但是,我明白你的意圖,將它推入對象結構本身 – Kiran

0

這甚至不會編譯。而且,使用單身人士遲早會讓你陷入麻煩。例如,你什麼時候會銷燬實例?在C++中,最好是明確構造和破壞。查找static gateway patternexample in C#)。

祝你好運!

+0

你不'不得不手動銷燬C++中的靜態實例,它們將在'main'結束後以相反的構造順序銷燬。 – fredoverflow

+0

是的弗雷德是對的,那就是問題所在。銷燬順序取決於您確實無法控制的施工順序。 –