• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            C++之竹

            無論是太陽下,還是風雨中,都要成長!

            常用鏈接

            統計

            最新評論

            Singleton模式——C++應用(二)

            看了通過靜態成員實現的惰性單件,雖說構件簡單且線程安全,但在被全局變量(包括靜態全局變量)的構造或析構調用時,會存在著那樣的缺陷畢竟還是很讓人不爽。那么,是否存在保持上面的優點同時剔除了上面的缺陷的C++單件呢?

             

            我們知道,定義于函數內部的靜態局部變量,有著

            • 定義的實時性,即只在函數第一次被調用時才被定義
            • 線程安全性
            • 生命期直到程序結束

            的特點。那么,通過這個局部靜態變量來創建的單件又會是什么樣呢?貼上我的Demo代碼,這就來看看吧。

              1// Singleton demo_1: Singleton instance is a local static varible of class.
              2
              3#include <Windows.h>
              4#include <iostream>
              5
              6class A 
              7{
              8public:
              9    static A& GetInstance();
             10
             11private:
             12    A() : m_nStat1(-1), m_nStat2(-1{
             13        m_nStat1 = 0;
             14        std::cout << "Construct A" << std::endl;
             15        m_nStat2 = 0;
             16    }

             17    A(const A&);
             18
             19public:
             20    ~A() {
             21        m_nStat1 = 0;
             22        std::cout << "Destruct A" << std::endl;
             23        m_nStat2 = 0;
             24    }

             25
             26    void Do() {
             27        ++m_nStat1;
             28        ++m_nStat2;
             29        std::cout << "Called Do() by object of A. [" 
             30                  << m_nStat1 << "" 
             31                  << m_nStat2 << "]" 
             32                  << std::endl;
             33    }

             34
             35private:
             36    int m_nStat1;
             37    int m_nStat2;
             38}
            ;
             39
             40class B
             41{
             42public:
             43    B(int nID) : m_nID(nID) {
             44        std::cout << "Construct B: " << m_nID << std::endl;
             45        A::GetInstance().Do();
             46    }

             47    ~B() {
             48        std::cout << "Destruct B: " << m_nID << std::endl;
             49        A::GetInstance().Do();
             50    }

             51
             52private:
             53    int m_nID;
             54}
            ;
             55
             56class C
             57{
             58public:
             59    static C& GetInstance();
             60
             61private:
             62    C() : m_nStat(-1{
             63        std::cout << "Construct C" << std::endl;
             64        m_nStat = 0;
             65    }

             66    C(const C&);
             67
             68public:
             69    ~C() {
             70        std::cout << "Destruct C" << std::endl;
             71        m_nStat = 0;
             72    }

             73
             74    void Do() {
             75        ++m_nStat;
             76        std::cout << "Called Do() by object of C. [" 
             77            << m_nStat << "]" 
             78            << std::endl;
             79    }

             80
             81private:
             82    int m_nStat;
             83}
            ;
             84
             85static B gs_B0(0);
             86B g_B1(1);
             87
             88A& A::GetInstance()
             89{
             90    static A s_instance;
             91    
             92    return s_instance;
             93}

             94
             95C& C::GetInstance()
             96{
             97    static C s_instance;
             98
             99    return s_instance;
            100}

            101
            102static B gs_B2(2);
            103B g_B3(3);
            104
            105int main(int argc, char * argv[])
            106{
            107    std::cout << "Enter main" << std::endl;
            108    A::GetInstance().Do();
            109    C::GetInstance().Do();
            110
            111    system("pause");
            112    return 0;
            113}

            114

             接下來,自然就是執行結果:

            喲吼~,這不正是自己想要的結果么,Perfect!!

            構建簡單,創建具有實時性(在且只在第一次用到時創建),線程安全,可以被全局變量的構造和析構正常調用,就是它了,極力推薦!O(∩_∩)O~

             

            posted on 2012-03-12 02:08 青碧竹 閱讀(241) 評論(0)  編輯 收藏 引用 所屬分類: 設計模式

            91精品国产综合久久婷婷| 久久中文字幕无码专区| 欧美精品福利视频一区二区三区久久久精品 | 99久久婷婷国产一区二区| 久久久久99精品成人片欧美| 狠狠色狠狠色综合久久| 老男人久久青草av高清| 久久伊人精品一区二区三区| 国内精品伊人久久久影院| 中文字幕无码久久人妻| 麻豆av久久av盛宴av| 亚洲日本va中文字幕久久| 久久99热这里只有精品国产| 少妇内射兰兰久久| 久久精品无码一区二区无码| jizzjizz国产精品久久| 久久免费视频网站| 91久久精品国产免费直播| 草草久久久无码国产专区| 亚洲欧洲精品成人久久曰影片| 奇米影视7777久久精品人人爽| 人妻少妇久久中文字幕一区二区| 漂亮人妻被黑人久久精品| 99久久99久久久精品齐齐| 久久精品一区二区国产| 国内精品免费久久影院| 欧美亚洲国产精品久久| 久久99精品久久久久久久不卡| yellow中文字幕久久网| 久久久久久久97| 99久久99久久精品国产| 久久久这里有精品| AV无码久久久久不卡网站下载 | 九九久久精品国产| 久久天天躁狠狠躁夜夜2020 | 午夜精品久久久久久| 亚洲va久久久噜噜噜久久天堂| 国产精品久久久久久久久久免费| 久久香综合精品久久伊人| 色噜噜狠狠先锋影音久久| 色综合久久无码中文字幕|