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

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

 更新時間: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ù)不會自動調(diào)用,需要用戶這個類的用戶手動delete instance. 這樣是不太好的


這是懶漢式的,在多線程的情況下需要同步。也可以寫成餓漢式的,但是c++里面寫成餓漢式的不太好,如果有多個單例類,而他們是相互引用的,那么餓漢式就有可能出問題。因為在C++中,這幾個單例類的靜態(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";
}

用了一個內(nèi)部類, Garbo。 由于main結(jié)束后,會自動釋放 garbo, 而garbo就會調(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é)束后會自動釋放。

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

四、改進的文藝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";
}

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

相關(guān)文章

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

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

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

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

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

    C++制作鼠標(biāo)連點器實例代碼

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評論

白河县| 和龙市| 中山市| 体育| 孝义市| 毕节市| 仪陇县| 三明市| 栖霞市| 岑巩县| 岫岩| 志丹县| 拉萨市| 镇赉县| 略阳县| 沐川县| 衡东县| 图们市| 茌平县| 东平县| 武宁县| 巴里| 新丰县| 连南| 南康市| 金山区| 白城市| 临西县| 尚义县| 永康市| 临江市| 郸城县| 沅陵县| 淳化县| 黄骅市| 固始县| 普兰店市| 乐都县| 崇仁县| 丰顺县| 连江县|