• <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 閱讀(1474) 評論(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

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

            公告

            導航

            隨筆分類

            最新隨筆

            最新評論

            閱讀排行榜

            久久精品国产免费| 2020最新久久久视精品爱| 国产一区二区久久久| 大香伊人久久精品一区二区| 欧美麻豆久久久久久中文| 一本一本久久a久久综合精品蜜桃| 国内精品久久久久久久久电影网| 久久久噜噜噜久久| 亚洲AV无一区二区三区久久 | 一本大道久久a久久精品综合| 91精品国产高清久久久久久国产嫩草| 亚洲精品久久久www| www久久久天天com| 精品一二三区久久aaa片| 久久精品国产精品国产精品污| 久久久亚洲欧洲日产国码是AV| 久久99久久99小草精品免视看| 伊人久久大香线蕉综合网站| 久久99精品久久久久久齐齐| 久久国产一区二区| 97久久久精品综合88久久| 久久人妻AV中文字幕| 亚洲欧美国产日韩综合久久| 青青青青久久精品国产| 无遮挡粉嫩小泬久久久久久久| 精品久久久久久久国产潘金莲 | 亚洲精品tv久久久久久久久 | 久久亚洲精品成人无码网站| 久久精品国产一区二区三区不卡| 久久超碰97人人做人人爱| 国内精品伊人久久久久777| 婷婷久久五月天| 久久天天躁狠狠躁夜夜躁2014| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 久久亚洲欧美国产精品| 97久久国产露脸精品国产| 久久人人爽人人爽人人片av麻烦 | 亚洲愉拍99热成人精品热久久| 无码人妻久久一区二区三区免费丨| 国内精品久久久久影院老司| 狠狠色婷婷久久综合频道日韩|