abstract类中可以有private的成员_C++|static成员与单例模式
如果需要一個(gè)全局對(duì)象,如對(duì)話框、系統(tǒng)日志、顯卡等設(shè)備的驅(qū)動(dòng)程序?qū)ο?、一臺(tái)PC連接一個(gè)鍵盤等。這樣的全局對(duì)象只能是一個(gè)且是全局的,這就是單例模式,如何實(shí)現(xiàn)呢?
1 不能在類外部通過(guò)構(gòu)造函數(shù)新建對(duì)象:構(gòu)造函數(shù)的訪問(wèn)方式設(shè)置為private或protected。同時(shí),拷貝構(gòu)造函數(shù)和賦值運(yùn)算符也是私有的,以禁止拷貝和賦值。
2 能夠通過(guò)調(diào)用一個(gè)成員函數(shù)來(lái)實(shí)例化一個(gè)對(duì)象:成員函數(shù)設(shè)置為static,這樣可以在沒(méi)有對(duì)象存在的情形下通過(guò)類名來(lái)調(diào)用這一成員函數(shù);
3 需要確保上述成員函數(shù)在對(duì)象已經(jīng)存在的情形下不再創(chuàng)建新對(duì)象:增加一個(gè)本類指針的static數(shù)據(jù)成員作為條件變量。
如果是多線程,還是可能創(chuàng)建多個(gè)實(shí)例,需要進(jìn)行Lock操作(如Boost庫(kù)支持此操作)。
#include using namespace std;class Singleton{public: static Singleton *GetInstance() // 靜態(tài)成員函數(shù)構(gòu)造一個(gè)實(shí)例 {// Lock(); // 多線程時(shí)(Boost庫(kù)支持Lock操作) if (m_Instance == NULL) { m_Instance = new Singleton(); // ① }// UnLock();// static Singleton m_Instance; // ② 多線程時(shí) return m_Instance;// return const_cast (m_Instance); // ③ 常量對(duì)象只有一次創(chuàng)建的機(jī)會(huì) } static void DestoryInstance() { if (m_Instance != NULL ) { delete m_Instance; m_Instance = NULL ; } } // This is just a operation example int GetTest() { return m_Test; }private: Singleton(){ m_Test = 10; } // 構(gòu)造函數(shù)私有 Singleton::Singleton(const Singleton&) {} // 拷貝構(gòu)造函數(shù)私有 Singleton &Singleton::operator=(const Singleton&) {} // 賦值運(yùn)算符私有 static Singleton* m_Instance; // 靜態(tài)數(shù)據(jù)成員用于判斷是否存在類實(shí)例 int m_Test; // used for test};Singleton *Singleton ::m_Instance = NULL;int main(int argc , char *argv []){ Singleton *singletonObj = Singleton ::GetInstance(); cout<GetTest()<一般的編程觀念是,new操作需要和delete操作進(jìn)行匹配;上述的實(shí)現(xiàn)中,添加了一個(gè)DestoryInstance的static函數(shù),這也是最簡(jiǎn)單,最普通的處理方法了;但是,很多時(shí)候,很容易忘記調(diào)用DestoryInstance函數(shù),就像你忘記了調(diào)用delete操作一樣。由于怕忘記delete操作,所以就有了智能指針;那么,在單例模型中,沒(méi)有“智能單例”,怎么辦?
在實(shí)際項(xiàng)目中,特別是客戶端開(kāi)發(fā),其實(shí)是不在乎這個(gè)實(shí)例的銷毀的。因?yàn)?#xff0c;全局就這么一個(gè)變量,全局都要用,它的生命周期伴隨著軟件的生命周期,軟件結(jié)束了,它也就自然而然的結(jié)束了,因?yàn)橐粋€(gè)程序關(guān)閉之后,它會(huì)釋放它占用的內(nèi)存資源的,所以,也就沒(méi)有所謂的內(nèi)存泄漏了。但是,有以下情況,是必須需要進(jìn)行實(shí)例銷毀的:
如果類中有一些文件鎖、文件句柄、數(shù)據(jù)庫(kù)連接等,這些隨著程序的關(guān)閉而不會(huì)立即關(guān)閉的資源,必須要在程序關(guān)閉前,進(jìn)行手動(dòng)釋放。
定義一個(gè)供單例類使用的內(nèi)部GC類,用來(lái)釋放資源。由于程序在結(jié)束的時(shí)候,系統(tǒng)會(huì)自動(dòng)析構(gòu)所有的全局變量,實(shí)際上,系統(tǒng)也會(huì)析構(gòu)所有類的靜態(tài)成員變量,就像這些靜態(tài)變量是全局變量一樣。我們知道,靜態(tài)變量和全局變量在內(nèi)存中,都是存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū)的,所以在析構(gòu)時(shí),是同等對(duì)待的。
#include using namespace std;class Singleton{public: static Singleton *GetInstance() { return m_Instance; } int GetTest() { return m_Test; }private: Singleton(){ m_Test = 10; } static Singleton *m_Instance; int m_Test; class GC { public : ~GC() { // We can destory all the resouce here, eg:db connector, file handle and so on if (m_Instance != NULL ) { cout<< "Here is the test" <GetTest()<ref:
https://www.cnblogs.com/ring1992/p/9592817.html
-End-
總結(jié)
以上是生活随笔為你收集整理的abstract类中可以有private的成员_C++|static成员与单例模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 服务器网站显示多协议,解决高防IIS8服
- 下一篇: guid java_JAVA实现生成GU