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

C++ 中的單例模式(普通,2B,文藝)

 更新時(shí)間:2013年03月22日 18:18:49   作者:  
這篇文章主要介紹C++ 中的單例模式寫法,主要包括普通,2B,文藝三種寫法,需要的朋友可以參考下

一、普通Singleton

復(fù)制代碼 代碼如下:

#include<iostream>
using namespace std;
class Singleton
{
    public:
        static Singleton* getInstance();
    private:
        static Singleton* instance;
        Singleton()
        {
            cout<<"constructor\n";
            // do something
        };
        ~Singleton()
        {
            cout<<"destructor\n";
            //do something
        }
};
Singleton* Singleton::instance = NULL;
Singleton* Singleton::getInstance()
{
    if(instance == NULL)
        instance = new Singleton();
    return instance;
}
int main()
{
    cout<<"begin main\n";
    Singleton* instance = Singleton::getInstance();
    cout<<"end main\n";
}

但是這樣構(gòu)造函數(shù)不會(huì)自動(dòng)調(diào)用,需要用戶這個(gè)類的用戶手動(dòng)delete instance. 這樣是不太好的


這是懶漢式的,在多線程的情況下需要同步。也可以寫成餓漢式的,但是c++里面寫成餓漢式的不太好,如果有多個(gè)單例類,而他們是相互引用的,那么餓漢式就有可能出問(wèn)題。因?yàn)樵贑++中,這幾個(gè)單例類的靜態(tài)成員的初始化順序是不確定的。


二、2B的Singleton

復(fù)制代碼 代碼如下:

#include<iostream>
using namespace std;
class Singleton
{
    public:
        static Singleton* getInstance();
    private:
        static Singleton* instance;
        Singleton()
        {
            cout<<"constructor\n";
            // do something
        };
        ~Singleton()
        {
            cout<<"destructor\n";
            //do something
        }
        class Garbo
        {
            public:
                ~Garbo()
                {
                    cout<<"Garbo destructor\n";
                    if(Singleton::instance != NULL)
                        delete Singleton::instance;
                }
        };
        static Garbo garbo;
};
Singleton* Singleton::instance = NULL;
Singleton::Garbo Singleton::garbo;
Singleton* Singleton::getInstance()
{
    if(instance == NULL)
        instance = new Singleton();
    return instance;
}
int main()
{
    cout<<"begin main\n";
    Singleton* instance = Singleton::getInstance();
    cout<<"end main\n";
}

用了一個(gè)內(nèi)部類, Garbo。 由于main結(jié)束后,會(huì)自動(dòng)釋放 garbo, 而garbo就會(huì)調(diào)用instance的destructor.

三、文藝Singleton

復(fù)制代碼 代碼如下:

#include<iostream>
using namespace std;
class Singleton
{
    public:
        static Singleton* getInstance();
    private:
        static Singleton instance;
        Singleton()
        {
            cout<<"constructor\n";
            // do something
        };
        ~Singleton()
        {
            cout<<"destructor\n";
            //do something
        }
};
Singleton Singleton::instance;
Singleton* Singleton::getInstance()
{
    return &instance;
}
int main()
{
    cout<<"begin main\n";
    Singleton* instance = Singleton::getInstance();
    cout<<"end main\n";
}

instance在main開始前就已經(jīng)構(gòu)造好了,在main結(jié)束后會(huì)自動(dòng)釋放。

但是這樣的話,只能是餓漢式的singleton。如果在構(gòu)造函數(shù)中需要申請(qǐng)大量資源,這些資源就一直存在在整個(gè)運(yùn)行階段。而不管這些資源什么時(shí)候需要,什么時(shí)候不許要。

四、改進(jìn)的文藝Singleton

復(fù)制代碼 代碼如下:

#include<iostream>
using namespace std;
class Singleton
{
    public:
        static Singleton* getInstance();
    private:
        Singleton()
        {
            cout<<"constructor\n";
            // do something
        };
        ~Singleton()
        {
            cout<<"destructor\n";
            //do something
        }
};
Singleton* Singleton::getInstance()
{
    static Singleton instance;
    return &instance;
}
int main()
{
    cout<<"begin main\n";
    Singleton* instance = Singleton::getInstance();
    cout<<"end main\n";
}

這樣,就可以在需要的時(shí)候再構(gòu)造singleton, 也就是懶漢式的。

相關(guān)文章

  • C/C++編寫推箱子小游戲

    C/C++編寫推箱子小游戲

    這篇文章主要為大家詳細(xì)介紹了C/C++編寫推箱子小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++實(shí)現(xiàn)LeetCode(164.求最大間距)

    C++實(shí)現(xiàn)LeetCode(164.求最大間距)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(164.求最大間距),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++制作鼠標(biāo)連點(diǎn)器實(shí)例代碼

    C++制作鼠標(biāo)連點(diǎn)器實(shí)例代碼

    大家好,本篇文章主要講的是C++制作鼠標(biāo)連點(diǎn)器實(shí)例代碼,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • C++實(shí)現(xiàn)LeetCode165.版本比較)

    C++實(shí)現(xiàn)LeetCode165.版本比較)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode165.版本比較),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言實(shí)現(xiàn)靜態(tài)版通訊錄的代碼分享

    C語(yǔ)言實(shí)現(xiàn)靜態(tài)版通訊錄的代碼分享

    這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的靜態(tài)版通訊錄,主要運(yùn)用了結(jié)構(gòu)體,一維數(shù)組,函數(shù),分支與循環(huán)語(yǔ)句等等知識(shí),需要的可以參考一下
    2023-01-01
  • C++實(shí)現(xiàn)LeetCode(71.簡(jiǎn)化路徑)

    C++實(shí)現(xiàn)LeetCode(71.簡(jiǎn)化路徑)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(71.簡(jiǎn)化路徑),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 如何統(tǒng)計(jì)在一篇文章中某個(gè)單詞出現(xiàn)了幾次,以及第一次出現(xiàn)的位置

    如何統(tǒng)計(jì)在一篇文章中某個(gè)單詞出現(xiàn)了幾次,以及第一次出現(xiàn)的位置

    本文的主要內(nèi)容就是統(tǒng)計(jì)某個(gè)單詞在一篇文章中出現(xiàn)了幾次,以及第一次出現(xiàn)的位置,需要的朋友可以參考下
    2015-08-08
  • c++實(shí)現(xiàn)二路歸并排序的示例代碼

    c++實(shí)現(xiàn)二路歸并排序的示例代碼

    這篇文章主要介紹了c++實(shí)現(xiàn)二路歸并排序的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • C語(yǔ)言實(shí)現(xiàn)導(dǎo)航功能

    C語(yǔ)言實(shí)現(xiàn)導(dǎo)航功能

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)導(dǎo)航功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語(yǔ)言軟件spi虛擬總線中間層設(shè)計(jì)詳解

    C語(yǔ)言軟件spi虛擬總線中間層設(shè)計(jì)詳解

    這篇文章主要為大家介紹了C語(yǔ)言軟件spi虛擬總線中間層設(shè)計(jì)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01

最新評(píng)論

监利县| 金秀| 吉林省| 玛沁县| 盘锦市| 丹江口市| 鸡泽县| 三亚市| 贵德县| 广平县| 嘉定区| 麻城市| 浦县| 临泽县| 鞍山市| 岳西县| 通山县| 钟祥市| 淄博市| 徐汇区| 平遥县| 涞水县| 沙湾县| 普兰县| 临高县| 宜宾市| 柳江县| 博罗县| 平南县| 临泉县| 山阴县| 习水县| 庄河市| 施秉县| 茌平县| 赤峰市| 南投县| 余干县| 乌什县| 蚌埠市| 黄平县|