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

C++使用智能指針實(shí)現(xiàn)模板形式的單例類

 更新時(shí)間:2021年06月14日 12:04:58   作者:帶著你的名字  
這篇文章主要為大家詳細(xì)介紹了C++使用了智能指針實(shí)現(xiàn)模板形式的單例類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文通過(guò)實(shí)例為大家分享了C++使用智能指針實(shí)現(xiàn)模板形式的單例類的具體代碼,供大家參考,具體內(nèi)容如下

實(shí)現(xiàn)一個(gè)模板形式的單例類,對(duì)于任意類型的類經(jīng)過(guò)Singleton的處理之后,都能獲取一個(gè)單例對(duì)象,并且可以傳遞任意參數(shù)

并且還使用了智能指針,把生成的單例對(duì)象托管給智能指針,從而實(shí)現(xiàn)自動(dòng)回收單例對(duì)象的資源

此外,如果需要一個(gè)放在靜態(tài)成員區(qū)的對(duì)象供其他類使用,又不希望修改原有的類的代碼,這時(shí)候可以通過(guò)該模板套一層殼,形成單例對(duì)象。

頭文件

template_singleton.hpp

#include <iostream>
#include <string>
#include <memory>

using std::cout;
using std::endl;
using std::string;
using std::shared_ptr;
using std::make_shared;

template <typename T> class Singleton;

class Point
{
    //由于構(gòu)造和析構(gòu)被設(shè)為私有,想使用單例模板創(chuàng)造對(duì)象,就應(yīng)該把其設(shè)為友元
    template <typename T> friend class Singleton;
    
public:
    //把析構(gòu)函數(shù)設(shè)為private之后,智能指針?shù)N毀時(shí)無(wú)法調(diào)用
    //所以析構(gòu)應(yīng)該設(shè)置為public,但是就算是共有的析構(gòu),由于是把單例對(duì)象的內(nèi)容托管給了智能指針
    //通過(guò)智能指針顯式的調(diào)用析構(gòu)函數(shù),也是無(wú)法回收單例對(duì)象的,所以,不影響單例模式的實(shí)現(xiàn)
    ~Point(){
        cout << "~Point()" << endl;
    }

    void show(){
        cout << "(" << _ix << ", " << _iy << ")" << endl;
    }

private:
    //單例模式,要把構(gòu)造函數(shù)和析構(gòu)函數(shù)設(shè)為私有
    Point(int x, int y) : _ix(x), _iy(y)
    {
        cout << "Point(int, int)" << endl;
    }
    /* ~Point(){ */
    /*     cout << "~Point()" << endl; */
    /* } */

private:
    int _ix;
    int _iy;
};

class Computer
{
    //由于構(gòu)造和析構(gòu)被設(shè)為私有,想使用單例模板創(chuàng)造對(duì)象,就應(yīng)該把其設(shè)為友元
    template <typename T> friend class Singleton;

public:
    void show(){
        cout << "name: " << _name << "  price: " << _price << endl;
    }
    void reset(const string &newname, const int &newprice){
        _name = newname;
        _price = newprice;
    }
    
    //使用public的析構(gòu)函數(shù),不影響單例模式的實(shí)現(xiàn)
    ~Computer(){
        cout << "~Computer()" << endl;
    }

private:
    //單例模式,要把構(gòu)造函數(shù)設(shè)為私有
    //使用模板生成單例對(duì)象的時(shí)候調(diào)用了make_shared函數(shù),如果傳入的是棧上的內(nèi)容
    //make_shared函數(shù)會(huì)調(diào)用拷貝構(gòu)造函數(shù)在堆上重新生成一個(gè)托管給智能指針的對(duì)象,
    //并把原先的對(duì)象銷毀,所以會(huì)在make_shared里面執(zhí)行一次析構(gòu)函數(shù)
    /* Computer(const Computer &rhs){ */
    /*     cout << "拷貝構(gòu)造函數(shù)" << endl; */
    /* } */
    Computer(const string &name, const int price)
        :_name(name), _price(price) 
    {
        cout << "Computer(const string &, const int &)" << endl;
    }
    /* ~Computer(){ */
    /*     cout << "~Computer()" << endl; */
    /* } */

private:
    string _name;
    int _price;
};

//模板形式的單例類(使用了智能指針),應(yīng)該使用飽漢模式
template <typename T>
class Singleton
{
public:
    template <typename ...Args> 
        static shared_ptr<T> getInstance(Args... args){
            if(_pInstance == nullptr){
                //這里會(huì)直接調(diào)用相應(yīng)的類型的構(gòu)造函數(shù),托管給智能指針,類型在實(shí)例化后確定
                /* //使用臨時(shí)對(duì)象托管給智能指針的時(shí)候,由于臨時(shí)對(duì)象分配在棧上, */
                /* //所以在make_shared內(nèi)部會(huì)重新分配堆上的空間來(lái)保存其內(nèi)容, */
                /* //會(huì)調(diào)用拷貝構(gòu)造函數(shù),并把臨時(shí)對(duì)象銷毀 */
                /* _pInstance = make_shared<T>(T(args...)); */

                //如果把一個(gè)分配在堆上的指針托管給智能指針,傳入的指針就不會(huì)被銷毀
                T *tmp = new T(args...);
                _pInstance = make_shared<T>(*tmp);
            }
            return _pInstance;
        }

private:
    //由于使用了模板,所以_pInstance實(shí)際上指向的是 T ,而非本類型,
    //所以并不會(huì)生成Singleton對(duì)象,而是直接生成相應(yīng)的T對(duì)象
    //T在實(shí)例化之后才會(huì)確定,究竟是哪種類型,
    //所以Singleton的構(gòu)造函數(shù)和析構(gòu)函數(shù)并不會(huì)執(zhí)行
    Singleton(){
        cout << "Singleton()" << endl;
    }

    ~Singleton(){
        cout << "~Singleton()" << endl;
    }

    static shared_ptr<T> _pInstance;  //單例模式的指針,指向唯一的實(shí)體
};

//由于類型在實(shí)例化是才會(huì)確定,所以使用飽漢模式
template <typename T>
shared_ptr<T> Singleton<T>::_pInstance = nullptr;

測(cè)試文件

test_template_singleton.cc

#include "template_singleton.hpp"
#include <stdio.h>

using std::cout;
using std::endl;
using std::cin;

void test(){
    shared_ptr<Computer> pc1 = Singleton<Computer>::getInstance("Xiaomi", 6666);
    cout << "pc1: ";
    pc1->show();

    shared_ptr<Computer> pc2 = Singleton<Computer>::getInstance("Xiaomi", 6666);
    cout << "pc1: ";
    pc1->show();
    cout << "pc2: ";
    pc2->show();

    pc2->reset("Huawei", 8888);
    cout << endl << "after pc2->reset()" << endl;
    cout << "pc1: ";
    pc1->show();
    cout << "pc2: ";
    pc2->show();
    cout << endl;

    shared_ptr<Point> pt3 = Singleton<Point>::getInstance(1, 2);
    shared_ptr<Point> pt4 = Singleton<Point>::getInstance(1, 2);

    cout << endl << "通過(guò)模板,可以生成不同類型的單例對(duì)象:" << endl;
    cout << "pt3: ";
    pt3->show();
    cout << "pt4: ";
    pt4->show();

    cout << endl << "使用了智能指針,不同對(duì)象指向的地址也一樣:" << endl;
    printf("&pc1 = %p\n", &pc1);
    printf("&pc2 = %p\n", &pc2);
    printf("&pt3 = %p\n", &pt3);
    printf("&pt4 = %p\n\n", &pt4);
    printf("&(*pc1) = %p\n", &(*pc1));
    printf("&(*pc2) = %p\n", &(*pc2));
    printf("&(*pt3) = %p\n", &(*pt3));
    printf("&(*pt4) = %p\n\n", &(*pt4));

}

int main()
{
    test();
    return 0;
}

運(yùn)行結(jié)果

Computer(const string &, const int &)
pc1: name: Xiaomi  price: 6666
pc1: name: Xiaomi  price: 6666
pc2: name: Xiaomi  price: 6666

after pc2->reset()
pc1: name: Huawei  price: 8888
pc2: name: Huawei  price: 8888

Point(int, int)

# 通過(guò)模板,可以生成不同類型的單例對(duì)象:
pt3: (1, 2)
pt4: (1, 2)

# 使用了智能指針,不同對(duì)象指向的地址也一樣:
&pc1 = 0x7ffe83bbd390
&pc2 = 0x7ffe83bbd3a0
&pt3 = 0x7ffe83bbd3b0
&pt4 = 0x7ffe83bbd3c0

&(*pc1) = 0x55b750c7e300
&(*pc2) = 0x55b750c7e300
&(*pt3) = 0x55b750c7e360
&(*pt4) = 0x55b750c7e360

~Point()
~Computer()

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)輸入一個(gè)字符串后打印出該字符串中字符的所有排列

    C語(yǔ)言實(shí)現(xiàn)輸入一個(gè)字符串后打印出該字符串中字符的所有排列

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)輸入一個(gè)字符串后打印出該字符串中字符的所有排列的方法,是數(shù)學(xué)中非常實(shí)用的排列算法,需要的朋友可以參考下
    2014-09-09
  • c++11&14-STL要點(diǎn)匯總

    c++11&14-STL要點(diǎn)匯總

    這篇文章主要介紹了c++11&14中的STL要點(diǎn),文中代碼簡(jiǎn)單易懂,方便大家更好的學(xué)習(xí)參考,感興趣的朋友可以了解下
    2020-06-06
  • C++98/11/17表達(dá)式類別(小結(jié))

    C++98/11/17表達(dá)式類別(小結(jié))

    這篇文章主要介紹了C++98/11/17表達(dá)式類別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • C/C++ Qt QThread線程組件的具體使用

    C/C++ Qt QThread線程組件的具體使用

    QThread庫(kù)是QT中提供的跨平臺(tái)多線程實(shí)現(xiàn)方案,本文詳細(xì)的介紹了Qt QThread線程組件的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • c++虛函數(shù)與虛函數(shù)表原理

    c++虛函數(shù)與虛函數(shù)表原理

    這篇文章主要介紹了c++虛函數(shù)與虛函數(shù)表原理,用virtual?修飾的成員函數(shù)叫虛函數(shù),下面圍繞c++虛函數(shù)與虛函數(shù)得相關(guān)資料展開(kāi)內(nèi)容,需要的朋友可以參考一下
    2021-12-12
  • C/C++實(shí)現(xiàn)動(dòng)態(tài)庫(kù)動(dòng)態(tài)加載

    C/C++實(shí)現(xiàn)動(dòng)態(tài)庫(kù)動(dòng)態(tài)加載

    在很多項(xiàng)目中,我們多少會(huì)用到第三方動(dòng)態(tài)庫(kù),這些動(dòng)態(tài)庫(kù)一般都是相對(duì)固定,使用也很簡(jiǎn)單,下面我們就來(lái)看看c/c++中如何實(shí)現(xiàn)動(dòng)態(tài)庫(kù)動(dòng)態(tài)加載吧
    2024-01-01
  • C語(yǔ)言編程中函數(shù)的基本學(xué)習(xí)教程

    C語(yǔ)言編程中函數(shù)的基本學(xué)習(xí)教程

    這篇文章主要介紹了C語(yǔ)言編程中函數(shù)的基本學(xué)習(xí)教程,其中著重講到了傳值調(diào)用與參數(shù),需要的朋友可以參考下
    2015-12-12
  • C++分析如何用虛析構(gòu)與純虛析構(gòu)處理內(nèi)存泄漏

    C++分析如何用虛析構(gòu)與純虛析構(gòu)處理內(nèi)存泄漏

    虛析構(gòu)和純虛析構(gòu)共性:可以解決父類指針釋放子類對(duì)象,都需要有具體的函數(shù)實(shí)現(xiàn);虛析構(gòu)和純虛析構(gòu)區(qū)別:如果是純虛析構(gòu),該類屬于抽象類,無(wú)法實(shí)例化對(duì)象
    2022-08-08
  • C++設(shè)計(jì)模式之享元模式(Flyweight)

    C++設(shè)計(jì)模式之享元模式(Flyweight)

    這篇文章主要為大家詳細(xì)介紹了C++設(shè)計(jì)模式之享元模式Flyweight,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • C++中的繼承方式與菱形繼承解析

    C++中的繼承方式與菱形繼承解析

    這篇文章主要介紹了C++中的繼承方式與菱形繼承解析,繼承是類和類之間的關(guān)系,是代碼復(fù)用的重要手段,允許在保持原有類結(jié)構(gòu)的基礎(chǔ)上進(jìn)行擴(kuò)展,創(chuàng)建的新類與原有的類類似,只是多了幾個(gè)成員變量和成員函數(shù),需要的朋友可以參考下
    2023-08-08

最新評(píng)論

韶关市| 通城县| 乌海市| 慈利县| 怀仁县| 买车| 德安县| 陇西县| 江孜县| 石河子市| 澜沧| 大石桥市| 抚松县| 宝丰县| 崇州市| 沅陵县| 寿宁县| 杭锦旗| 洛隆县| 云南省| 中方县| 扎赉特旗| 津南区| 玉溪市| 贵溪市| 桃园市| 礼泉县| 巩义市| 溆浦县| 孟村| 油尖旺区| 潞西市| 高安市| 大名县| 宜城市| 巍山| 陆丰市| 大渡口区| 临安市| 盖州市| 龙川县|