2010-08-15 55 views
1

我有四個類,讓我們調用S1,S2,S3和S4。這些課是單身人士;每個人都有一個getInstance和一個finalize方法 - 以及一個實例私有變量。在C++中創建一個SingletonMixin類

現在,爲了避免repeting的最終化和getInstance方法我試圖做一個SingletonMixin類,類似:

template<class T> class SingletonMixin 
{ 
    public: 
     static T* getInstance(); 
    private: 
     static T* instance; 

}; 

這裏的問題是:如何能夠例如單身clasess並保持其構造私有?


編輯

(澄清)

我的意思是,我怎麼能做到這一點:

template<class T> T* SingletonMixin<T>::instance = 0; 
template<class T> T* SingletonMixin<T>::getInstance() 
{ 
    if (instance == 0) 
    { 
     instance = T(); 
    } 
    return instance; 
}; 

但私人牛逼結構T()


謝謝!

+2

簡單的答案是:不要。儘可能避免單身人士是可怕的設計模式。 – Puppy 2010-08-15 15:07:42

+0

四個單身課程?大多數人無法想到* one *適當使用單身人士。 – jalf 2010-08-15 20:22:33

+0

@jalf:只是一個練習,我正在學習這門語言。 – Hugo 2010-08-16 23:52:26

回答

1

問題:如果您使(de)構造函數爲私有,則Singleton基類無法生成實例。

但是:

friend class SingletonMixin<Foo>; 

是你的朋友。

+1

沒有解構器,只有析構器。 – 2010-08-15 16:03:18

0

以下不行嗎?

class Foo : public SingletonMixin<Foo> 
{ 
}; 
+0

它不起作用,如果它們是受保護的/私有的,基類不能調用派生類的構造函數/析構函數。你已經聲明基類是一個「朋友」,可以做到這一點。 – Praetorian 2010-08-15 17:15:52

0

單身和遺傳混合在一起非常糟糕。這是因爲關於單例的基本陳述是:「只能有一個這個類的實例」,而子類的存在意味着至少存在不同實例的可能性。你幾乎可以肯定地重構這個,讓這四個類不是單例。