• <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>

            大規(guī)模高性能網(wǎng)絡(luò)服務(wù)器編程 大型游戲服務(wù)器編程


            大規(guī)模高性能網(wǎng)絡(luò)服務(wù)器編程 大型游戲服務(wù)器編程 完成端口模型 TCP UDP P2P 網(wǎng)絡(luò)編程

                       C++博客 | 首頁(yè) | 發(fā)新隨筆 | 發(fā)新文章 | 聯(lián)系 | 聚合 | 管理

                          

            利用宏實(shí)現(xiàn)的一個(gè)singleton


            代碼:uniobj.h
             1 /************************************************************************
             2 *
             3 * Created by kusamba@126.com at 2009-2-12 16:37
             4 */
             5 
             6 #ifndef _uniobj_23593953_h_
             7 #define _uniobj_23593953_h_
             8 
             9 #include <WTypes.h>
            10 #include <assert.h>
            11 
            12 /**
            13 * Universal Object Declare
            14 */
            15 #define UNIOBJ_DECL(theClass)                \
            16   public:                                    \
            17   static theClass* Get()                     \
            18   {                                          \
            19     assert(NULL != ms_pk##theClass);         \
            20     return ms_pk##theClass;                  \
            21   }                                          \
            22   static theClass* Create()                  \
            23   {                                          \
            24     assert(NULL == ms_pk##theClass);         \
            25     return ms_pk##theClass = new theClass(); \
            26   }                                          \
            27   static void Destroy()                      \
            28   {                                          \
            29     if (NULL != ms_pk##theClass)             \
            30     {                                        \
            31       delete ms_pk##theClass;                \
            32       ms_pk##theClass = NULL;                \
            33     }                                        \
            34   }                                          \
            35   publicbool Initialize();                 \
            36   private:                                   \
            37     theClass();                              \
            38     virtual ~theClass();                     \
            39     static theClass* ms_pk##theClass;
            40 
            41 /**
            42 * Universal Object Implement
            43 */
            44 #define UNIOBJ_IMP(theClass)                \
            45     theClass* theClass::ms_pk##theClass = NULL;
            46 
            47 
            48 #endif//_uniobj_23593953_h_

            如何使用:
            頭文件:
            1#include "uniobj.h"
            2
            3class ATestSingleTon
            4{
            5public:
            6
            7UNIOBJ_DECL(ATestSingleTon)
            8}

            cpp文件:
            1UNIOBJ_IMP(ATestSingleTon)
            2
                 ATestSingleTon::ATestSingleTon()
                {}

                ATestSingleTon::~ATestSingleTon()
                {}

            3bool ATestSingleTon::Initialize()
            4{
            5    return true;
            6}

            main.cpp
             1int main()
             2{
             3  ATestSingleTon* pk = ATestSingleTon::Create();
             4  if (NULL == pk)
             5  {
             6    return 0;
             7  }

             8
             9  //mainloop
            10
            11  ATestSingleTon::Destroy();
            12}

            分析:
            1,singleton的構(gòu)建在程序入口,析構(gòu)在程序的結(jié)尾,可以避免相當(dāng)多的多線程問題
            2,這里的singleton對(duì)象均為程序必須要用到的對(duì)象,跟傳統(tǒng)singleton定義有些出入
            3,定義了initialize()函數(shù)只為對(duì)象的初始化提供一個(gè)接口,如果不需要可以直接return true


            PS:可以參考看看如下資料
            1,細(xì)說(shuō)Singleton模式:創(chuàng)建、多線程與銷毀 http://developer.51cto.com/art/200908/143492.htm

            posted on 2010-08-31 15:56 iKusamba 閱讀(1473) 評(píng)論(10)  編輯 收藏 引用 所屬分類: C++技術(shù)

            評(píng)論

            # re: 利用宏實(shí)現(xiàn)的一個(gè)singleton 2010-08-31 18:00 陳梓瀚(vczh)

            MySingleton& GetSingleton()
            {
            static MySingleton singleton;
            return singleton;
            }  回復(fù)  更多評(píng)論   

            # re: 利用宏實(shí)現(xiàn)的一個(gè)singleton 2010-08-31 18:11 iKusamba

            @陳梓瀚(vczh)

            這是最常見的Meyers Singleton,有些編譯器可能會(huì)出錯(cuò),還有析構(gòu)時(shí)間沒有辦法控制,可能會(huì)導(dǎo)致K.D.L方面的問題

            我的想法是避免多線程和內(nèi)存方面的問題  回復(fù)  更多評(píng)論   

            # re: 利用宏實(shí)現(xiàn)的一個(gè)singleton 2010-09-01 10:13 陳碩

            1. 既然對(duì)象肯定要用到而且會(huì)在main()里邊析構(gòu),那么用一個(gè)全局的指針不就行了?在main()里邊構(gòu)造一個(gè)局部對(duì)象,把全局指針指向它。完全不必用宏,也不必手動(dòng)釋放對(duì)象。
            2. 為了防止在別處意外構(gòu)造對(duì)象,把構(gòu)造函數(shù)的參數(shù)定為 enum YouShouldNotConstructTheObjectUnlessInMain,這樣一搜源代碼就知道有沒有人故意誤用。
            3. 為什么要默認(rèn)使用虛析構(gòu)?既然構(gòu)造函數(shù)是private的,說(shuō)明根本不可能創(chuàng)建派生類的對(duì)象,虛析構(gòu)意義何在?  回復(fù)  更多評(píng)論   

            # re: 利用宏實(shí)現(xiàn)的一個(gè)singleton 2010-09-01 10:52 cpp

            我覺得我們是否更應(yīng)該去避免這些問題的產(chǎn)生,而不是去想法來(lái)解決“會(huì)出現(xiàn)”的問題呢。  回復(fù)  更多評(píng)論   

            # re: 利用宏實(shí)現(xiàn)的一個(gè)singleton 2010-09-01 12:05 iKusamba

            @陳碩

            感謝你提出的問題,我來(lái)逐條解釋下
            “1. 既然對(duì)象肯定要用到而且會(huì)在main()里邊析構(gòu),那么用一個(gè)全局的指針不就行了?在main()里邊構(gòu)造一個(gè)局部對(duì)象,把全局指針指向它。完全不必用宏,也不必手動(dòng)釋放對(duì)象?!?br>"2. 為了防止在別處意外構(gòu)造對(duì)象,把構(gòu)造函數(shù)的參數(shù)定為 enum YouShouldNotConstructTheObjectUnlessInMain,這樣一搜源代碼就知道有沒有人故意誤用。"
            答:全局變量和帶參數(shù)的構(gòu)造函數(shù)也是可以用的,這里討論的是singleton

            “3. 為什么要默認(rèn)使用虛析構(gòu)?既然構(gòu)造函數(shù)是private的,說(shuō)明根本不可能創(chuàng)建派生類的對(duì)象,虛析構(gòu)意義何在?”
            答:對(duì)象可能會(huì)有父類  回復(fù)  更多評(píng)論   

            # re: 利用宏實(shí)現(xiàn)的一個(gè)singleton 2010-09-01 12:08 iKusamba

            @cpp
            你說(shuō)的也對(duì),
            我覺得借助好的想法,好的框架再加上“更應(yīng)該去避免這些問題的產(chǎn)生”,能事半功倍!  回復(fù)  更多評(píng)論   

            # re: 利用宏實(shí)現(xiàn)的一個(gè)singleton 2010-09-02 12:48 陳梓瀚(vczh)

            @iKusamba
            那就加CriticalSection哈,就沒事了。反正肯定會(huì)在main之后析構(gòu)的,這個(gè)也不用控制了。如果你想控制,那還是給你的singleton類加上“Close()”。  回復(fù)  更多評(píng)論   

            # re: 利用宏實(shí)現(xiàn)的一個(gè)singleton 2010-09-02 12:49 陳梓瀚(vczh)

            @iKusamba
            應(yīng)該是“ExceptInMain”哈,Unless是不對(duì)的……  回復(fù)  更多評(píng)論   

            # re: 利用宏實(shí)現(xiàn)的一個(gè)singleton 2010-09-02 16:11 iKusamba

            @陳梓瀚(vczh)

            在內(nèi)部有static的Destroy()

            如果singleton中有new,可以在析構(gòu)函數(shù)中清除  回復(fù)  更多評(píng)論   

            # re: 利用宏實(shí)現(xiàn)的一個(gè)singleton 2010-09-02 23:32 chaogu

            我發(fā)現(xiàn)模式里面討論的最多的是單例,其實(shí)單例也就那么一回事。
            線程安全好像討論的最多,線程安全各有各的說(shuō)法,有沒有更加有力的說(shuō)法?
              回復(fù)  更多評(píng)論   

            公告

            導(dǎo)航

            隨筆分類

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            国产韩国精品一区二区三区久久| 97热久久免费频精品99| 国产ww久久久久久久久久| 久久不射电影网| 久久99精品久久久久久野外 | 国产69精品久久久久9999APGF| 亚洲午夜福利精品久久| 久久大香萑太香蕉av| 精品一区二区久久| 久久久青草青青国产亚洲免观| 亚洲av日韩精品久久久久久a| 94久久国产乱子伦精品免费| 久久久久久久久波多野高潮| 欧美日韩中文字幕久久伊人| 东方aⅴ免费观看久久av| 久久久久无码中| 狠狠色丁香久久综合五月| 久久久久久久免费视频| 久久综合狠狠色综合伊人| 婷婷综合久久中文字幕蜜桃三电影| 久久国产视频网| 97久久超碰成人精品网站| 久久久久青草线蕉综合超碰 | 欧美日韩中文字幕久久久不卡| 国产精品久久波多野结衣| 思思久久99热免费精品6| 久久久精品午夜免费不卡| 人妻精品久久无码专区精东影业| 久久久WWW成人| 久久精品无码一区二区三区日韩| 久久91综合国产91久久精品| 亚洲乱码精品久久久久..| 精品久久久久久久久免费影院| 亚洲人成无码久久电影网站| 中文精品久久久久国产网址| 999久久久无码国产精品| 精品久久8x国产免费观看| 亚洲嫩草影院久久精品| 亚洲一区中文字幕久久| 国产精品一区二区久久精品无码| 久久精品中文字幕第23页|