亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C++ 中的Singleton 類的實現討論

2019-11-17 05:04:34
字體:
來源:轉載
供稿:網友
  ANSI C++ 中的 Singleton 實現說難不難,說輕易也不輕易,很多人寫 ANSI C++ 的 Singleton class 都有錯誤。這篇文章討論怎樣在 ANSI c++ 中寫 Singleton class, 希望對大家有幫助。   《設計模式》中把 Singleton 寫成返回指針:



class Singleton{
public:
    static Singleton* Instance();
PRotected:
    Singleton();
private:
    static Singleton* _instance;
};      相應的實現 cpp 文件是:
Singleton* Singleton::_instance;
Singleton* Singleton::Instance(){
    if( _instance == 0){
        _instance = new Singleton;
    };
    return _instance;
}      將構造函數設計成 protected 的目的是防止在 class 外面 new ,有人可能會設計成 private ,假如考慮到有可能會繼續這個類的話,還是將構造函數設計成 protected 比較好,還需要加一個 virtual 析構函數。為了防止別人復制 Singleton 對象:
Singleton* pSingleton = Singleton::Instance();
Singleton s1 = *pSingleton;
Singleton s2 = *pSingleton;
需要將拷貝構造(copy constrUCtor)函數變成 private。
    但是這里存在的問題是,什么時候刪除 Singleton 對象?按照 C++ 的一個基本原則,對象在哪里創建就在哪里銷毀,這里還應該放一個 destroy 方法來刪除 Singleton 對象。假如忘了刪除就比較麻煩。Instance 函數還存在多線程同時訪問的加鎖問題。假如把 Instance 函數開始和結尾放上加鎖和解鎖,整個函數性能會下降很多。這不是一個好的設計。
    有一個小小的改動,可以避免忘了刪除 Singleton 對象帶來內存泄露的問題。那就是用 std:auto_ptr 來包含 Singleton 對象,定義一個class static member auto_ptr 對象,在析構的靜態 auto_ptr 變量的時候時候自動刪除 Singleton 對象。為了不讓用戶 delete Singleton 對象,需要將析構函數由 public 變成 protected。以下是頭文件 SingletonAutoPtr.h :
#include <memory>
using namespace std;
class CSingletonAutoPtr
{
private:
    static auto_ptr<CSingletonAutoPtr> m_auto_ptr; 



更多文章 更多內容請看C/C++技術專題專題,或


    static CSingletonAutoPtr* m_instance;
protected:
    CSingletonAutoPtr();
    CSingletonAutoPtr(const CSingletonAutoPtr&);
    virtual ~CSingletonAutoPtr();
    //allow auto_ptr to delete, using protected ~CSingletonAutoPtr()
    friend class auto_ptr<CSingletonAutoPtr>;
public:
    static CSingletonAutoPtr* GetInstance();
    void Test();
};   對應的 SingletonAutoPtr.cpp 如下:
#include "SingletonAutoPtr.h"
#include <iostream>//initial static member vars here
CSingletonAutoPtr* CSingletonAutoPtr::m_instance = NULL;
auto_ptr<CSingletonAutoPtr> CSingletonAutoPtr::m_auto_ptr;/////////////////////////////////////////
// Construction/Destruction
/////////////////////////////////////////

CSingletonAutoPtr::CSingletonAutoPtr()
{
    cout << "CSingletonAutoPtr::CSingletonAutoPtr()" << endl;
    //put single object into auto_ptr object
    m_auto_ptr = auto_ptr<CSingletonAutoPtr>(this);
}CSingletonAutoPtr::~CSingletonAutoPtr()
{
    cout << "CSingletonAutoPtr::~CSingletonAutoPtr()" << endl;
}CSingletonAutoPtr* CSingletonAutoPtr::GetInstance()
{
    //begin lock
    //....    if(m_instance == NULL)
        m_instance = new CSingletonAutoPtr();    //end lock
    //...    return m_instance; 



更多文章 更多內容請看C/C++技術專題專題,或


}void CSingletonAutoPtr::Test()
{
    cout << "CSingletonAutoPtr::Test()" << endl;
}     調用方法:
CSingletonAutoPtr* pSingleton = CSingletonAutoPtr::GetInstance();
pSingleton->Test();     寫一個 C++ 中的 Singleton 需要這么費勁,大大出乎我們的意料。有很多人從未用過 auto_ptr,而且 std:auto_ptr 本身就并不完美,它是基于對象所有權機制的,相比之下,Apache Log4cxx 中有一個 auto_ptr, 是基于對象計數的,更為好用。只是為了用一個好的 auto_ptr 而不得不用 log4cxx , 對于很多項目來說,也不太好。當然了,ANSI C++ 的 STL 中 std:auto_ptr 對于寫上面的例子已經足夠用了。     另外一個思路是,把 GetInstance 函數設計成 static member 可能更好,因為一般來說,Singleton 對象都不大,static member 雖然必須一直占用內存,問題不大。這里的析構函數必須設成 public 了。以下是頭文件 SingleStaticObj.h
class CSingletonStaticObj
{
private:
    static CSingletonStaticObj m_instance;
protected:
    CSingletonStaticObj();
    CSingletonStaticObj(const CSingletonStaticObj&);
public:
    virtual ~CSingletonStaticObj(); //must public
    static CSingletonStaticObj& GetInstance();
    void Test();
};     對應的 SingleStaticObj.cpp 文件為:#include "SingletonStaticObj.h"
#include <string>
#include <iostream> 




更多文章 更多內容請看C/C++技術專題專題,或


using namespace std;CSingletonStaticObj CSingletonStaticObj::m_instance;CSingletonStaticObj::CSingletonStaticObj()
{
    cout << "CSingletonStaticObj::CSingletonStaticObj()" << endl;
}CSingletonStaticObj::~CSingletonStaticObj()
{
    cout << "CSingletonStaticObj::~CSingletonStaticObj()" << endl;
}CSingletonStaticObj& CSingletonStaticObj::GetInstance()

{
    return m_instance;
}void CSingletonStaticObj::Test()
{
    cout << "CSingletonStaticObj::Test()" << endl;
}     調用方法:
CSingletonStaticObj& singleton = CSingletonAutoPtr::GetInstance();
singleton.Test();     從代碼量來說,似乎使用 static member ref 更為簡單。我更偏向于用這種方法。    但是,并不是所有情況下面都適合用 static member singleton。比如說,GetInstance 需要動態決定返回不同的 instance 的時候,就不能用。舉例來說,FileSystem::GetInstance, 在 windows 下面運行可能需要返回 new WinFileSystem, linux/Unix 下面運行可能需要返回 new LinuxFileSystem,這個時候還是需要用上面的 auto_ptr 包含 singleton 指針的方法。



更多文章 更多內容請看C/C++技術專題專題,或

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲iv一区二区三区| 欧美多人乱p欧美4p久久| 中文字幕免费精品一区高清| 911国产网站尤物在线观看| 日韩在线视频播放| 亚洲欧美激情在线视频| 欧美极品欧美精品欧美视频| 大量国产精品视频| 国产精品福利观看| 成人av色在线观看| 性色av一区二区三区免费| 在线成人中文字幕| 亚洲一区二区在线播放| 热99精品只有里视频精品| 欧美午夜片在线免费观看| www.日韩视频| 国产精品亚洲欧美导航| 亚洲视频国产视频| 亚洲精品91美女久久久久久久| 亚洲字幕在线观看| 国产精品久久久久久搜索| 久久夜色精品国产亚洲aⅴ| 欧美国产视频一区二区| 伊人久久久久久久久久| 一夜七次郎国产精品亚洲| 国产精品18久久久久久首页狼| 中文字幕免费精品一区高清| 26uuu另类亚洲欧美日本老年| 色黄久久久久久| 日韩女优人人人人射在线视频| 亚洲精品白浆高清久久久久久| 久久视频在线播放| 久久久久久美女| 成人性教育视频在线观看| 国产97在线视频| 中文字幕9999| 亚洲精品国产拍免费91在线| 欧美精品在线免费观看| 色综合天天狠天天透天天伊人| 国产精品日日摸夜夜添夜夜av| 91国内在线视频| 欧美一级视频在线观看| 亚洲一区二区三区xxx视频| 亚洲免费小视频| 欧美激情图片区| 久久精品亚洲一区| 91九色单男在线观看| 色噜噜狠狠狠综合曰曰曰88av| 久久久久久久久电影| 亚洲国产精品视频在线观看| 成人深夜直播免费观看| 亚洲精品一区久久久久久| 国产精品高潮视频| 久久天天躁狠狠躁夜夜躁| 性欧美在线看片a免费观看| 欧美自拍视频在线| 欧美黄色成人网| 亚洲影院在线看| 亚洲国产精品专区久久| 欧美日韩国产中字| 欧美日韩国内自拍| 日韩一区二区三区国产| 久久精品亚洲国产| 午夜精品久久久99热福利| 日韩久久精品成人| 欧洲美女免费图片一区| 亚洲精品视频在线观看视频| 91久久久久久久久久| 黑人巨大精品欧美一区免费视频| 欧美日韩中文字幕综合视频| 日韩一区二区欧美| 亚洲女人天堂成人av在线| 亚洲a级在线播放观看| 国产精品v片在线观看不卡| 日韩成人高清在线| 日韩中文字幕第一页| 日韩成人久久久| 日本精品一区二区三区在线| 亚洲精品久久久久久久久久久久久| 欧美国产视频一区二区| 日韩电影第一页| 98精品国产高清在线xxxx天堂| 日韩乱码在线视频| 亚洲精品影视在线观看| 中文字幕亚洲无线码a| 日韩电影中文 亚洲精品乱码| 日韩av大片免费看| 夜夜嗨av色一区二区不卡| 亚洲国产精品久久91精品| 91精品综合视频| 欧美大胆a视频| 国产日韩在线播放| 国产成人精品在线视频| 亚洲色图欧美制服丝袜另类第一页| 国产午夜一区二区| 久久久久久久久国产精品| 91精品国产色综合| 亚洲男人第一网站| 亚洲黄色免费三级| 国产成人鲁鲁免费视频a| 亚洲精品福利在线| 成人a免费视频| 91国语精品自产拍在线观看性色| 成人在线观看视频网站| 中文字幕亚洲欧美日韩在线不卡| 欧美在线一级视频| 日韩欧美视频一区二区三区| 久久国产一区二区三区| 国产欧美精品在线| 久久天天躁狠狠躁夜夜躁| 国产精品va在线播放我和闺蜜| 动漫精品一区二区| 亚洲香蕉成人av网站在线观看| 久久精品亚洲热| 麻豆乱码国产一区二区三区| 国产精品激情av在线播放| 日韩中文娱乐网| 91精品国产网站| 日韩美女激情视频| 日韩精品小视频| 韩国精品美女www爽爽爽视频| 日本精品免费一区二区三区| 第一福利永久视频精品| 92国产精品久久久久首页| 久久午夜a级毛片| 亚洲色图国产精品| 欧美精品www在线观看| 亚洲国产精品va在线看黑人| 亚洲激情小视频| 992tv成人免费影院| 国产精品久久久久久av| 丝袜亚洲另类欧美重口| 成人写真视频福利网| 精品福利免费观看| xxx欧美精品| 欧美激情一级二级| 欧美成人高清视频| 亚洲精品视频免费| 欧美在线观看视频| 久久久久久久久久久网站| 欧美激情在线有限公司| 国产精自产拍久久久久久| 欧美性高潮在线| 国产成人精品免费视频| 欧美成人午夜激情在线| 亚洲男人天堂久| 欧美亚洲在线观看| 欧美中文字幕视频在线观看| 日韩免费观看网站| 日韩中文字幕免费| 91久久久久久| 精品中文字幕视频| 在线视频日韩精品| 色噜噜狠狠狠综合曰曰曰| 91亚洲精品久久久久久久久久久久| 国产亚洲精品久久久久久牛牛| 久久99久国产精品黄毛片入口| 亚洲欧美一区二区激情| 日韩av中文字幕在线免费观看| 91久久在线播放| 中文一区二区视频| 亚洲精品电影网在线观看| 亚洲人成免费电影| 亚洲japanese制服美女|