• <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)  編輯 收藏 引用 所屬分類: 設計模式

            久久久噜噜噜久久| 香蕉aa三级久久毛片| 日本人妻丰满熟妇久久久久久| 亚洲香蕉网久久综合影视| 99久久久精品| 国产精品久久久久久五月尺| 乱亲女H秽乱长久久久| 久久久久国产精品嫩草影院| 亚洲国产精品无码久久久不卡| 久久电影网一区| 久久久国产精华液| 久久久久亚洲?V成人无码| 久久久一本精品99久久精品66| 久久久青草青青国产亚洲免观| 久久综合给久久狠狠97色| 污污内射久久一区二区欧美日韩| 久久久久久国产精品免费无码 | 无码任你躁久久久久久| 色欲综合久久中文字幕网| 久久精品综合一区二区三区| 国产精品久久国产精品99盘| 久久国产色av免费看| 久久青青草原精品国产软件| 青青草原综合久久大伊人精品| 人妻少妇久久中文字幕| 久久精品国产2020| 97久久婷婷五月综合色d啪蜜芽 | 26uuu久久五月天| 精品熟女少妇a∨免费久久| 国内精品综合久久久40p| 亚洲欧美日韩精品久久亚洲区| 成人综合久久精品色婷婷| 秋霞久久国产精品电影院| 99re久久精品国产首页2020| 久久亚洲欧美国产精品| 久久人爽人人爽人人片AV | 2020国产成人久久精品| 理论片午午伦夜理片久久 | 久久99国产精品久久| 大伊人青草狠狠久久| AV狠狠色丁香婷婷综合久久|