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

            大規模高性能網絡服務器編程 大型游戲服務器編程


            大規模高性能網絡服務器編程 大型游戲服務器編程 完成端口模型 TCP UDP P2P 網絡編程

                       C++博客 | 首頁 | 發新隨筆 | 發新文章 | 聯系 | 聚合 | 管理

                          

            利用宏實現的一個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的構建在程序入口,析構在程序的結尾,可以避免相當多的多線程問題
            2,這里的singleton對象均為程序必須要用到的對象,跟傳統singleton定義有些出入
            3,定義了initialize()函數只為對象的初始化提供一個接口,如果不需要可以直接return true


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

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

            評論

            # re: 利用宏實現的一個singleton 2010-08-31 18:00 陳梓瀚(vczh)

            MySingleton& GetSingleton()
            {
            static MySingleton singleton;
            return singleton;
            }  回復  更多評論   

            # re: 利用宏實現的一個singleton 2010-08-31 18:11 iKusamba

            @陳梓瀚(vczh)

            這是最常見的Meyers Singleton,有些編譯器可能會出錯,還有析構時間沒有辦法控制,可能會導致K.D.L方面的問題

            我的想法是避免多線程和內存方面的問題  回復  更多評論   

            # re: 利用宏實現的一個singleton 2010-09-01 10:13 陳碩

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

            # re: 利用宏實現的一個singleton 2010-09-01 10:52 cpp

            我覺得我們是否更應該去避免這些問題的產生,而不是去想法來解決“會出現”的問題呢。  回復  更多評論   

            # re: 利用宏實現的一個singleton 2010-09-01 12:05 iKusamba

            @陳碩

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

            “3. 為什么要默認使用虛析構?既然構造函數是private的,說明根本不可能創建派生類的對象,虛析構意義何在?”
            答:對象可能會有父類  回復  更多評論   

            # re: 利用宏實現的一個singleton 2010-09-01 12:08 iKusamba

            @cpp
            你說的也對,
            我覺得借助好的想法,好的框架再加上“更應該去避免這些問題的產生”,能事半功倍!  回復  更多評論   

            # re: 利用宏實現的一個singleton 2010-09-02 12:48 陳梓瀚(vczh)

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

            # re: 利用宏實現的一個singleton 2010-09-02 12:49 陳梓瀚(vczh)

            @iKusamba
            應該是“ExceptInMain”哈,Unless是不對的……  回復  更多評論   

            # re: 利用宏實現的一個singleton 2010-09-02 16:11 iKusamba

            @陳梓瀚(vczh)

            在內部有static的Destroy()

            如果singleton中有new,可以在析構函數中清除  回復  更多評論   

            # re: 利用宏實現的一個singleton 2010-09-02 23:32 chaogu

            我發現模式里面討論的最多的是單例,其實單例也就那么一回事。
            線程安全好像討論的最多,線程安全各有各的說法,有沒有更加有力的說法?
              回復  更多評論   

            公告

            導航

            隨筆分類

            最新隨筆

            最新評論

            閱讀排行榜

            久久99热这里只频精品6| 亚洲一区中文字幕久久| 久久亚洲国产最新网站| 色婷婷综合久久久久中文字幕| 久久人人爽人人澡人人高潮AV| 国产精品久久久久蜜芽| 婷婷综合久久中文字幕蜜桃三电影| 99久久人妻无码精品系列蜜桃| 精品人妻伦一二三区久久| 一级做a爰片久久毛片毛片| 性高湖久久久久久久久| 日韩精品久久久久久| 国产亚洲精品久久久久秋霞| 99久久99这里只有免费的精品| 久久精品国产男包| 国内精品久久久久久中文字幕| 精品久久久久久无码专区不卡| 香蕉久久AⅤ一区二区三区| 久久亚洲精精品中文字幕| 狠狠色婷婷久久综合频道日韩| 久久精品国产只有精品66| 久久精品天天中文字幕人妻| 久久精品国产亚洲Aⅴ香蕉| 色综合久久88色综合天天| 久久久国产视频| 久久91精品综合国产首页| 精品久久久无码人妻中文字幕豆芽 | 一本伊大人香蕉久久网手机| 久久青青草原精品国产软件| 国产午夜电影久久| 久久人人爽人人爽人人av东京热| 欧美久久久久久精选9999| 国产L精品国产亚洲区久久| 国内精品久久久久| 久久婷婷国产综合精品| 亚洲av成人无码久久精品| 久久精品国产亚洲av麻豆小说| 无码人妻精品一区二区三区久久 | 亚洲av成人无码久久精品 | 国产精品99久久久久久董美香| 久久综合狠狠综合久久综合88|