• <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++之竹

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

            常用鏈接

            統(tǒng)計

            最新評論

            Singleton模式——C++應(yīng)用(二)

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

             

            我們知道,定義于函數(shù)內(nèi)部的靜態(tài)局部變量,有著

            • 定義的實時性,即只在函數(shù)第一次被調(diào)用時才被定義
            • 線程安全性
            • 生命期直到程序結(jié)束

            的特點。那么,通過這個局部靜態(tài)變量來創(chuàng)建的單件又會是什么樣呢?貼上我的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

             接下來,自然就是執(zhí)行結(jié)果:

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

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

             

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

            老司机国内精品久久久久| 国内精品久久久久久久亚洲| 午夜欧美精品久久久久久久| 99久久无码一区人妻a黑| 国产精品青草久久久久福利99| 精品视频久久久久| 性色欲网站人妻丰满中文久久不卡| 久久免费视频网站| 99久久无色码中文字幕人妻| 青青青青久久精品国产| 97久久婷婷五月综合色d啪蜜芽 | 久久涩综合| 欧美精品久久久久久久自慰| 久久久中文字幕日本| 久久精品国产亚洲AV无码偷窥| 人妻少妇精品久久| 国产精品久久久久天天影视| 精品无码久久久久国产动漫3d| 日本道色综合久久影院| 99久久久精品免费观看国产| 亚洲精品乱码久久久久久蜜桃图片| 久久综合一区二区无码| 亚洲天堂久久精品| 美女写真久久影院| 成人资源影音先锋久久资源网| 18禁黄久久久AAA片| 国产69精品久久久久观看软件| 三级韩国一区久久二区综合| 国产成人久久777777| 狠狠综合久久综合中文88| 久久中文字幕一区二区| 热99re久久国超精品首页| 精品久久久久久亚洲| 婷婷综合久久中文字幕| 丁香五月综合久久激情| 99久久精品九九亚洲精品| 99久久99久久精品国产片果冻| 91麻豆精品国产91久久久久久| 国产精品日韩欧美久久综合| 久久久人妻精品无码一区| 久久国产精品无|