欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c++中的單例類模板的實現方法詳解

 更新時間:2020年03月16日 09:40:29   作者:PRO_Z  
這篇文章主要介紹了c++中的單例類模板的實現方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

 1、什么是單例模式

  在架構設計時,某些類在整個系統(tǒng)生命周期中最多只能有一個對象存在 ( Single Instance )。如超市收銀系統(tǒng),其外觀主要由顯示器(1個)、掃描槍(1個)、收款箱(1個)組成,在系統(tǒng)正常運行期間這三部分都是唯一存在的;也就是說,顯示器、掃描槍、收款箱這三部分都應該有各自的類,并且每個類只能唯一地實例化一個對象,基于這種模式的程序設計,稱為單例模式。

 ?。。。卫J街荒軇?chuàng)建一個對象,且該對象的生命周期伴隨系統(tǒng)的整個運行期間。

2、怎么實現單例模式

  思考:如何定義一個類,使得這個類最多只能創(chuàng)建一個對象?

  分析:因為對象是由構造函數創(chuàng)建的,所以我們應該將問題鎖定在構造函數上;又因為只能創(chuàng)建一個對象,這就意味著只能調用一次構造函數;顯然將構造函數的訪問權限設置為 public 不合適,所以,構造函數的訪問權限只能是 private。然后,定義一個私有的靜態(tài)成員 c_instance = NULL 和 公有的靜態(tài)成員函數,通過  c_instance 來判斷是否創(chuàng)建對象。(這個為什么要使用 靜態(tài)成員呢?因為構造函數是私有的,在類的外部無法創(chuàng)建對象,只能通過類名調用靜態(tài)成員,而靜態(tài)成員函數只能調用靜態(tài)成員變量)

  上述分析過程可簡化為:

  (1)將構造函數的訪問屬性設置為 private;

  (2)定義私有的靜態(tài)成員屬性 instance 并初始化為 NULL;

 ?。?)當需要使用對象時,訪問 instance 的值;

           1)空值:創(chuàng)建對象,并用 instance 標記;

           2)非空值:返回 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();  // 創(chuàng)建對象的入口
  
  void print()
  {
    cout << "this = " << this << endl;
  }
};

SObject* SObject::c_instance = NULL; // 靜態(tài)成員類內聲明,類外定義

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();  // this = 0x940a008
  s1->print(); // this = 0x940a008
  s2->print(); // this = 0x940a008
  
  return 0;
}
// 注:單例模式中,對象的生命周期存在整個系統(tǒng)運行過程中,所以是絕對不釋放的;

 ·   其實,在上述的單例模式實現案列中,有一部分代碼(分析過程中第2、3步)與類本身沒有任何關系,既然是這樣,我們就把這部分單獨提取出來處理。

  問題所在:需要使用單例模式時,必須在每個類中定義 靜態(tài)成員變量 c_instance 和 靜態(tài)成員函數 GetInstance();當有多個類都需要使用單例模式時,這樣的實現方式明顯的很冗余,為了能夠代碼復用,我們可以 將這兩部分抽象成一個新類(做成類模板,聲明為其它類的友元類,這樣與之前的效果一樣)。

基于類模板的單例模式實現

 // 對上個單例模式實現代碼的改進

// singleton.hpp 單例模式代碼
#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.hpp"

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();  // 0xe63c20
  s1->print(); // 0xe63c20
  s2->print(); // 0xe63c20
  
  return 0;
}

  在今后工作中,如果一個類(SObject)要使用單例模式(Singleton 單例模式的類模板),只需三步驟:

 ?。?)類(SObject)的構造函數必須私有化;同時,拷貝構造函數、重載=操作符 也私有化;

 ?。?)將單例模式的類模板聲明為這個類的友元類; friend class Singleton<SObject>;

 ?。?)通過 單例模式類模板中 SObject* s = Singleton<SObject>::GetInstance(); 創(chuàng)建對象。

到此這篇關于c++中的單例類模板的實現方法詳解的文章就介紹到這了,更多相關c++ 單例類模板內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++ 實現LRU 與 LFU 的緩存算法

    C++ 實現LRU 與 LFU 的緩存算法

    設計和實現一個LRU 緩存機制。其支持獲取數據 get 和 寫入數據 put,設計并實現最少訪問頻率(LFU)緩存的數據結構。LFU的每個數據塊都有一個引用計數,所有數據塊按照引用計數排序,具有相同引用計數的數據塊則按照時間進行排序。其支持get 和 put,具體了解請看下文
    2021-09-09
  • VC++ loadlibrary()加載三方dll失敗, 返回錯誤碼:126的解決方法

    VC++ loadlibrary()加載三方dll失敗, 返回錯誤碼:126的解決方法

    今天在編寫VC++ loadlibrary()加載三方dll是總是失敗,并且返回錯誤碼:126,這里就為大家分享一下具體的解決方法
    2021-03-03
  • Visual Studio Code (vscode) 配置 C / C++ 環(huán)境的流程

    Visual Studio Code (vscode) 配置 C / C++ 環(huán)境的流程

    這篇文章主要介紹了Visual Studio Code (vscode) 配置 C / C++ 環(huán)境的流程,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • VC取得任務欄高度的方法

    VC取得任務欄高度的方法

    這篇文章主要介紹了VC取得任務欄高度的方法,需要的朋友可以參考下
    2014-07-07
  • C/CPP運算優(yōu)先級的坑及解決

    C/CPP運算優(yōu)先級的坑及解決

    這篇文章主要介紹了C/CPP運算優(yōu)先級的坑及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Qt中QZXing 的編譯與使用

    Qt中QZXing 的編譯與使用

    本文主要介紹了Qt中QZXing 的編譯與使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C++?OpenCV紅綠燈檢測Demo實現詳解

    C++?OpenCV紅綠燈檢測Demo實現詳解

    OpenCV(Open Source Computer Vision Library)是開源的計算機視覺和機器學習庫,提供了C++、 C、 Python、 Java接口,并支持Windows、 Linux、 Android、 Mac OS平臺,下面這篇文章主要給大家介紹了關于C++?OpenCV紅綠燈檢測Demo實現的相關資料,需要的朋友可以參考下
    2022-11-11
  • c語言打開文件函數使用方法

    c語言打開文件函數使用方法

    這篇文章主要介紹了c語言打開文件函數使用方法,需要的朋友可以參考下
    2014-02-02
  • C++ 讓函數返回數組的方法

    C++ 讓函數返回數組的方法

    這篇文章主要介紹了C++ 讓函數返回數組的方法,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • C語言數組和指針,內存之間的關系

    C語言數組和指針,內存之間的關系

    這篇文章主要介紹了C語言數組和指針,內存之間的關系,首先論證一維數組和一級指針之前的關系,我們常常使用一級指針指針的方式訪問一維數組,只有對內存的理解到位才能理解它們直接的關系。需要的小伙伴可以參考一下
    2022-02-02

最新評論