日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

abstract类中可以有private的成员_C++|static成员与单例模式

發布時間:2024/7/23 c/c++ 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 abstract类中可以有private的成员_C++|static成员与单例模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如果需要一個全局對象,如對話框、系統日志、顯卡等設備的驅動程序對象、一臺PC連接一個鍵盤等。這樣的全局對象只能是一個且是全局的,這就是單例模式,如何實現呢?

1 不能在類外部通過構造函數新建對象:構造函數的訪問方式設置為private或protected。同時,拷貝構造函數和賦值運算符也是私有的,以禁止拷貝和賦值。

2 能夠通過調用一個成員函數來實例化一個對象:成員函數設置為static,這樣可以在沒有對象存在的情形下通過類名來調用這一成員函數;

3 需要確保上述成員函數在對象已經存在的情形下不再創建新對象:增加一個本類指針的static數據成員作為條件變量。

如果是多線程,還是可能創建多個實例,需要進行Lock操作(如Boost庫支持此操作)。

#include using namespace std;class Singleton{public: static Singleton *GetInstance() // 靜態成員函數構造一個實例 {// Lock(); // 多線程時(Boost庫支持Lock操作) if (m_Instance == NULL) { m_Instance = new Singleton(); // ① }// UnLock();// static Singleton m_Instance; // ② 多線程時 return m_Instance;// return const_cast (m_Instance); // ③ 常量對象只有一次創建的機會 } 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; } // 構造函數私有 Singleton::Singleton(const Singleton&) {} // 拷貝構造函數私有 Singleton &Singleton::operator=(const Singleton&) {} // 賦值運算符私有 static Singleton* m_Instance; // 靜態數據成員用于判斷是否存在類實例 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操作進行匹配;上述的實現中,添加了一個DestoryInstance的static函數,這也是最簡單,最普通的處理方法了;但是,很多時候,很容易忘記調用DestoryInstance函數,就像你忘記了調用delete操作一樣。由于怕忘記delete操作,所以就有了智能指針;那么,在單例模型中,沒有“智能單例”,怎么辦?

在實際項目中,特別是客戶端開發,其實是不在乎這個實例的銷毀的。因為,全局就這么一個變量,全局都要用,它的生命周期伴隨著軟件的生命周期,軟件結束了,它也就自然而然的結束了,因為一個程序關閉之后,它會釋放它占用的內存資源的,所以,也就沒有所謂的內存泄漏了。但是,有以下情況,是必須需要進行實例銷毀的:

如果類中有一些文件鎖、文件句柄、數據庫連接等,這些隨著程序的關閉而不會立即關閉的資源,必須要在程序關閉前,進行手動釋放。

定義一個供單例類使用的內部GC類,用來釋放資源。由于程序在結束的時候,系統會自動析構所有的全局變量,實際上,系統也會析構所有類的靜態成員變量,就像這些靜態變量是全局變量一樣。我們知道,靜態變量和全局變量在內存中,都是存儲在靜態存儲區的,所以在析構時,是同等對待的。

#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-

總結

以上是生活随笔為你收集整理的abstract类中可以有private的成员_C++|static成员与单例模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。