2011-09-28 51 views
1

在一些代碼,我看到像這樣使用單模板這是如何推動單身人士?

template<typename T> 
class Singleton 
{ 
public: 
    Singleton(T& instance) 
    { 
     assert(!sfpInstance || (sfpInstance==&instance)); 
     sfpInstance = &instance; 
    } 
    static T& getInstance() 
    { 
     assert(sfpInstance); 
     return *sfpInstance; 
    } 
private: 
    static T* sfpInstance; 
}; 

和類:

class MyClass : public Singleton<MyClass> 
{ 
    protected: 
     MyClass() : Singleton<MyClass>(*this) {} 
} 

我不知道這怎麼能作爲單身?

如果可以使用它,那麼使用它的正確方法是什麼。

編輯:MyClass的構造函數受到保護。

+1

簡短的回答是「不要使用單身人士,他們是邪惡的,無法調試」。 –

+0

「Singleton」中的構造函數應該受到保護。 –

+0

使用單例的正確方法根本不是。 –

回答

1

由於沒有MyClass的公共可用構造函數,而且Singleton不是MyClass的朋友,所以此代碼根本不起作用。

現在,如果MyClass的構造函數是/ public,那麼MyClass構造函數的每次調用都將檢查全局sfpInstance指針是否已指向某處的對象,如果是,則觸發斷言。因此,程序運行期間只能構建一個MyClass實例。請注意,此方法並不十分優雅,因爲它不會跟蹤MyClass單例實例的銷燬。

+0

MyClass的構造函數受保護(如果需要,也可以公開)。問題修改 – Yousf

+0

此外,您必須在某個初始化階段創建一個實例,而在標準單例中,您通常會進行延遲初始化。 – Seb