• <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?。?/p>

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

             

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

            欧美牲交A欧牲交aⅴ久久| 久久99精品九九九久久婷婷| 久久久久免费精品国产| 中文字幕乱码人妻无码久久| 欧美午夜精品久久久久免费视| 精品精品国产自在久久高清| 日韩一区二区久久久久久| 久久精品国产一区二区电影| 亚洲国产精品无码久久久秋霞2 | 亚洲国产精品人久久| 国产亚洲精久久久久久无码AV| 久久久SS麻豆欧美国产日韩| 成人国内精品久久久久影院VR| 久久综合亚洲色HEZYO社区| 成人资源影音先锋久久资源网| 天天影视色香欲综合久久| 久久精品亚洲一区二区三区浴池| 精品水蜜桃久久久久久久| 亚洲精品tv久久久久久久久| 国产午夜精品理论片久久| 国产V综合V亚洲欧美久久| 97视频久久久| 久久综合色老色| 久久亚洲电影| 久久久久国产一区二区| 久久精品国产亚洲沈樵| 国内精品久久久久久99蜜桃| 久久WWW免费人成一看片| 久久国产AVJUST麻豆| 亚州日韩精品专区久久久| 久久人妻少妇嫩草AV蜜桃| 青青草原1769久久免费播放| 国产精品欧美久久久天天影视| 久久亚洲美女精品国产精品| 99精品久久精品一区二区| 久久天天躁夜夜躁狠狠躁2022| 亚洲欧洲久久av| 亚洲精品乱码久久久久久| 久久精品国产99国产精品亚洲| 久久99精品国产麻豆宅宅| 色综合久久中文字幕无码|