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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单例类模板

發布時間:2025/4/5 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单例类模板 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1 單例類模板
      • 1.1 單例模式簡介
      • 1.2 單例類模板

1 單例類模板

1.1 單例模式簡介

需求的提出:在架構設計時,某些類在整個系統生命期中最多只能有一個對象存在(Single Instance)。

問題:如何定義一個類,使得這個類最多只能創建一個對象?

要控制類的對象數目,必須對外隱藏構造函數。思路如下:

  • 將構造函數的屬性設置為private。
  • 定義instance并初始化為NULL。
  • 當需要使用對象時,訪問instance的值:
    - 空值:創建對象,并用instance標記。
    - 非空值:返回instance標記對象。

編程實驗:單例模式初探

#include <iostream> #include <string>using namespace std;class SObject {static SObject* c_instance;SObject(const SObject&);SObject& operator= (const SObject&);SObject(){} public:static SObject* GetInstance();void print(){cout << "this = " << this << endl;} };SObject* SObject::c_instance = NULL;SObject* SObject::GetInstance() {if( c_instance == NULL ){c_instance = new SObject();}return c_instance; }int main() {SObject* s = SObject::GetInstance();SObject* s1 = SObject::GetInstance();SObject* s2 = SObject::GetInstance();s->print();s1->print();s2->print();return 0; }

如上實現存在的問題:

  • 當我們需要使用單例模式時:必須定義靜態成員變量c_instance,必須定義靜態成員函數GetInstance()。

解決方案:

  • 將單例模式相關的代碼抽取出來,開發單例類模板。當需要單例類時,直接使用單例類模板。

1.2 單例類模板

實現和使用方法如下:

Singleton.h:

#ifndef _SINGLETON_H_ #define _SINGLETON_H_template < typename T > class Singleton {static T* c_instance; public:static T* GetInstance(); };template < typename T > T* Singleton<T>::c_instance = NULL;template < typename T > T* Singleton<T>::GetInstance() {if( c_instance == NULL ){c_instance = new T();}return c_instance; }#endif

main.cpp:

#include <iostream> #include <string> #include "Singleton.h"using namespace std;class SObject {friend class Singleton<SObject>; // 當前類需要使用單例模式SObject(const SObject&);SObject& operator= (const SObject&);SObject(){} public:void print(){cout << "this = " << this << endl;} };int main() {SObject* s = Singleton<SObject>::GetInstance();SObject* s1 = Singleton<SObject>::GetInstance();SObject* s2 = Singleton<SObject>::GetInstance();s->print();s1->print();s2->print();return 0; }

參考資料:

  • C++深度解析教程
  • 總結

    以上是生活随笔為你收集整理的单例类模板的全部內容,希望文章能夠幫你解決所遇到的問題。

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