最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++中的單例類模板的實(shí)現(xiàn)方法詳解

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

 1、什么是單例模式

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

 ?。。?!單例模式只能創(chuàng)建一個(gè)對(duì)象,且該對(duì)象的生命周期伴隨系統(tǒng)的整個(gè)運(yùn)行期間。

2、怎么實(shí)現(xiàn)單例模式

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

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

  上述分析過(guò)程可簡(jiǎn)化為:

 ?。?)將構(gòu)造函數(shù)的訪問(wèn)屬性設(shè)置為 private;

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

 ?。?)當(dāng)需要使用對(duì)象時(shí),訪問(wèn) instance 的值;

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

           2)非空值:返回 instance 標(biāo)記的對(duì)象;

單例模式實(shí)現(xiàn)

#include <iostream>
#include <string>

using namespace std;

class SObject
{
  static SObject* c_instance; // 定義標(biāo)識(shí)符指針;

  /* 不需用拷貝和賦值,在單例模式中,始終只有一個(gè)對(duì)象 */  
  SObject(const SObject&);
  SObject& operator= (const SObject&);
  
  SObject() // 私有的構(gòu)造函數(shù)
  {
  }
public:
  static SObject* GetInstance();  // 創(chuàng)建對(duì)象的入口
  
  void print()
  {
    cout << "this = " << this << endl;
  }
};

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

SObject* SObject::GetInstance() // 單例模式的關(guān)鍵
{
  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;
}
// 注:?jiǎn)卫J街?,?duì)象的生命周期存在整個(gè)系統(tǒng)運(yùn)行過(guò)程中,所以是絕對(duì)不釋放的;

 ·   其實(shí),在上述的單例模式實(shí)現(xiàn)案列中,有一部分代碼(分析過(guò)程中第2、3步)與類本身沒(méi)有任何關(guān)系,既然是這樣,我們就把這部分單獨(dú)提取出來(lái)處理。

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

基于類模板的單例模式實(shí)現(xiàn)

 // 對(duì)上個(gè)單例模式實(shí)現(xiàn)代碼的改進(jìn)

// 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 測(cè)試文件
#include <iostream>
#include <string>
#include "singleton.hpp"

using namespace std;

class SObject
{
  friend class Singleton<SObject>;  // 當(dāng)前類需要使用單例模式
  
  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;
}

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

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

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

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

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

相關(guān)文章

  • c語(yǔ)言實(shí)現(xiàn)找最大值最小值位置查找

    c語(yǔ)言實(shí)現(xiàn)找最大值最小值位置查找

    這篇文章主要介紹了c語(yǔ)言實(shí)現(xiàn)找最大值最小值位置查找,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易三子棋

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易三子棋

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易三子棋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • map插入自定義對(duì)象總結(jié)

    map插入自定義對(duì)象總結(jié)

    黑樹(shù)在插入節(jié)點(diǎn)時(shí),必須依照大小比對(duì)之后在一個(gè)合適的位置上執(zhí)行插入動(dòng)作。所以作為關(guān)鍵字,起碼必須有“<”這個(gè)比較操作符
    2013-09-09
  • c語(yǔ)言根據(jù)用戶輸入的出生年份并計(jì)算出當(dāng)前年齡

    c語(yǔ)言根據(jù)用戶輸入的出生年份并計(jì)算出當(dāng)前年齡

    這篇文章主要介紹了c語(yǔ)言根據(jù)用戶輸入的出生年份并計(jì)算出當(dāng)前年齡,需要的朋友可以參考下
    2023-03-03
  • 分析C語(yǔ)言一個(gè)簡(jiǎn)單程序

    分析C語(yǔ)言一個(gè)簡(jiǎn)單程序

    本文主要介紹C語(yǔ)言簡(jiǎn)單的程序,這里給大家詳細(xì)介紹C語(yǔ)言代碼,對(duì)函數(shù)概念、頭文件、自定義函數(shù)等基礎(chǔ)信息的講解,希望能幫助剛剛學(xué)習(xí)的同學(xué)
    2016-07-07
  • C語(yǔ)言數(shù)獨(dú)游戲的求解方法

    C語(yǔ)言數(shù)獨(dú)游戲的求解方法

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言數(shù)獨(dú)游戲的求解方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C++哈希應(yīng)用之位圖,哈希切分與布隆過(guò)濾器詳解

    C++哈希應(yīng)用之位圖,哈希切分與布隆過(guò)濾器詳解

    這篇文章主要為大家詳細(xì)介紹了C++哈希應(yīng)用中的位圖、哈希切分與布隆過(guò)濾器,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的可以參考一下
    2023-04-04
  • 利用C語(yǔ)言編寫(xiě)“剪刀石頭布”小游戲

    利用C語(yǔ)言編寫(xiě)“剪刀石頭布”小游戲

    這篇文章主要給大家介紹了關(guān)于如何利用C語(yǔ)言編寫(xiě)“剪刀石頭布”小游戲的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • C/C++?Qt?給ListWidget組件增加右鍵菜單功能

    C/C++?Qt?給ListWidget組件增加右鍵菜單功能

    本篇文章給大家介紹ListWidget組件增加一個(gè)右鍵菜單,當(dāng)用戶在ListWidget組件中的任意一個(gè)子項(xiàng)下右鍵,我們讓其彈出這個(gè)菜單,并根據(jù)選擇提供不同的功能,感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • C語(yǔ)言代碼實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)

    C語(yǔ)言代碼實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言代碼實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評(píng)論

曲阜市| 西藏| 荣昌县| 海阳市| 宁明县| 安徽省| 遂平县| 惠安县| 太谷县| 盐池县| 安化县| 仪征市| 胶州市| 南江县| 克山县| 红桥区| 常宁市| 江陵县| 梁山县| 奉贤区| 亳州市| 开封县| 朔州市| 祥云县| 开远市| 凤阳县| 利辛县| 定州市| 彭阳县| 安福县| 台北市| 新建县| 宣城市| 修文县| 宁河县| 永平县| 凤山市| 达州市| 西藏| 开鲁县| 北碚区|