• <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 青碧竹 閱讀(250) 評論(0)  編輯 收藏 引用 所屬分類: 設計模式

            亚洲第一永久AV网站久久精品男人的天堂AV| 性做久久久久久久| 国产综合精品久久亚洲| 久久无码一区二区三区少妇| 久久综合久久美利坚合众国| 中文无码久久精品| 久久综合久久综合久久| 久久91精品国产91久| 99久久精品国产麻豆| 欧美久久久久久午夜精品| 伊人久久综合无码成人网| 精品久久久久国产免费 | 精品国产乱码久久久久久呢| 国产亚洲精品美女久久久| 久久午夜综合久久| 久久电影网2021| 亚洲精品乱码久久久久久按摩 | 狠狠色丁香婷婷久久综合五月 | 99久久精品免费| 久久精品人人做人人爽电影蜜月 | 欧美激情精品久久久久| 伊人久久大香线蕉亚洲五月天| 2021国产成人精品久久| 久久综合香蕉国产蜜臀AV| 热久久最新网站获取| 久久久艹| 久久九九久精品国产| 色综合久久精品中文字幕首页 | 国产精品久久免费| 久久婷婷五月综合97色一本一本| 国产精品久久久久久久人人看| 精品水蜜桃久久久久久久| 狠狠色婷婷综合天天久久丁香| 久久综合视频网站| 久久久久噜噜噜亚洲熟女综合| 国内精品久久久久久不卡影院| 久久成人国产精品| 99久久婷婷国产综合亚洲| 韩国三级大全久久网站| 色偷偷888欧美精品久久久| 久久国产成人午夜aⅴ影院|