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

            閱讀排行榜

            MM131亚洲国产美女久久| 久久精品一区二区三区中文字幕| 久久无码专区国产精品发布| 久久经典免费视频| 一级做a爰片久久毛片16| 亚洲Av无码国产情品久久| 一日本道伊人久久综合影| 少妇高潮惨叫久久久久久| 青青草国产精品久久久久| 伊人 久久 精品| 国内精品久久久久久野外| 一级女性全黄久久生活片免费| 久久久久久久久久久久中文字幕 | 色综合久久天天综线观看| 亚洲AV日韩精品久久久久久久| 91麻豆精品国产91久久久久久| 久久这里只有精品首页| 久久青青草原精品国产不卡| 99国产精品久久| 国内精品久久久久影院薰衣草 | 久久精品国产99久久久| 久久夜色撩人精品国产| 99久久99久久精品国产| 国产69精品久久久久777| 欧洲人妻丰满av无码久久不卡| 中文精品99久久国产| 久久久精品久久久久久 | 2021国产成人精品久久| 国内精品久久久久久99| 国产成人综合久久精品红| 久久99国产一区二区三区| 99久久国产热无码精品免费久久久久| 亚洲中文字幕无码久久2020| 亚洲午夜无码AV毛片久久| 久久一区二区三区免费| 天天影视色香欲综合久久| 要久久爱在线免费观看| 久久久久久久波多野结衣高潮| 97视频久久久| 久久久久久久亚洲Av无码| 91精品国产9l久久久久|