當**中出現全域性變數時,可以考慮採用單例模式來替換掉,以保持**的整潔。單例模式原理非常簡單,不外乎就是利用了static成員變數的唯一性。
簡單的說就是讓乙個類提供乙個公有介面,返回值為類的乙個物件,如果該物件未建立則建立之,如果已經建立過了,就直接將物件返回。
然而如果要深入其中進行研究,則有許多問題是可以挖一挖的。以下羅列了幾個挖掘點。
1、確保不會建立該類的其他例項。私有化建構函式、拷貝建構函式(其實就是建構函式一種)、賦值操作符。
2、返回指標還是返回引用。許多情況下用的是返回指標,但如果返回指標,使用者一不小心讓a指標指向b,然後delete a了,這個。。。那麼問題就來了。。。
3、有好幾個類都想用單例模式。想偷下懶,能不能單例特性弄成乙個父類,其他子類就不都單獨重寫單例特性了,直接繼承。。。這個要用到模板。
4、執行緒安全。
直接上**了。由於ide是用的qt,用了qmutex作為執行緒互斥鎖,其餘的是純c++。
#ifndef singleton_h
#define singleton_h
#include
templateclass singleton;};
//從自己的乙個模板類派生,模板遞迴
class singletona:public singleton;
friend class singleton; //宣告友元,保證可訪問派生類私有變數
public:
void
setval(int n); //加鎖保證執行緒安全
int getval();
};#endif // singleton_h
這段**的原始出處為《think in c++》,設計模式部分講單例的章節。
有多個類想實現單例而又只想寫一遍單例模式想偷下懶的童鞋們有福了。:)
這一小段**中就有這麼多道道啊。。。
**很簡潔,但其中蘊含的設計、思想、特性的運用確實是耐人尋味的。:)
最後,總結一下。單例其實就是利用了static關鍵字的特性。此處附送一點static用法總結吧。
1、static修飾類成員變數。表示此類的所有例項只共用乙份此靜態成員變數的副本,不論其實例有多少個。
2、static修飾全域性變數。表示此全域性變數僅在當前檔案中有效。意味著可以在另乙個cpp檔案中用同樣的名字來命名另乙個變數。當然也意味著當前檔案中的區域性全域性變數在另乙個檔案中無法引用。
3、static修飾區域性變數。表示此變數不會在return語句 }處銷毀,其生命週期持續到最後程式退出清理。而且static區域性變數只初始化一次,即雖然迴圈呼叫子模組,但子模組中static變數的宣告初始化只執行一次。
4、static修飾類成員函式。表示此函式沒有this指標的使用。是不針對某個物件而執行的,但是可以以物件名來呼叫,也可以以類名來呼叫。
那麼,static的作用抽象一下的話,也就是,改變物件的儲存位置,改變物件的生命週期,改變物件的作用域。而在c++中,改變了其儲存位置似乎很大程度上就改變了其生命週期(棧->堆->全域性變數區)。。
:)
c 單例模式模板
所有單例模類直接繼承此模板即可,執行緒安全,效率高 無鎖 延時構造。include using namespace std template class singleton 禁止拷貝 singleton const singleton delete singleton operator const ...
c 版本之單例模式
單例模式 singleton 是指乙個類僅有乙個例項物件,並且該類提供乙個獲得該例項物件的全域性訪問點,它包含三個關鍵元素 元素一 提供private型別的建構函式 元素二 提供private型別的的靜態成員變數,以儲存唯一的例項物件 元素三 提供獲得本類例項的全域性訪問點getinstance函式...
單例銷毀 C 單例模式的模板實現
單例模式是一種建立型的設計模式 creational design patterns 使用單例模式進行設計的類在程式中只擁有乙個例項 single instance 這個類稱為單例類,它會提供乙個全域性的訪問入口 global access point 關於單例模式的討論可以參考singleton ...