實習學到的一些東西(二)
阿新 • • 發佈:2018-12-10
最近實習一直在看公司程式碼框架,看到許多用到了單例模式的地方。有些是直接寫一個單例模式實現,有些則是繼承自一個單例模板。 因為繼承自單例模板的實現方式以前沒有接觸過,所以這裡記錄一下。
1、首先宣告一個單例模式模板基類:
template<class T>
class Singleton {
public:
static T* get() {
static T t;
return &t;
}
protected:
//設為protected是為了以後的派生類繼承它時可以呼叫建構函式
Singleton () {}
~Singleton() {}
private:
//拷貝建構函式和賦值運算都不被允許
Singleton(const Singleton& m);
Singleton& operator=(const Singleton& m);
};
2、然後令我們想運用單例模式的類繼承自這個類
注意繼承類時模板引數為該類本身,這樣做據說是atl-style程式碼,既可以節省記憶體(因為不需要虛擬函式表),且所有函式的呼叫在編譯時確定,因此它們是可以優化的(參考部落格)
class DerivedSingleton : public Singleton<DerivedSingleton> //模板引數為DerivedSingleton
{
... //該類的其他實現細節
};
然後就實現了單例模式啦~ 這裡好像沒有考慮到執行緒安全問題,需要的話可以看看這篇部落格。