大规模高性能网络服务器编程 大型游戏服务器编程


大规模高性能网络服务器编程 大型游戏服务器编程 完成端口模型 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 阅读(1447) 评论(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

我发现模式里面讨论的最多的是单例,其实单例也就那么一回事。
线程安全好像讨论的最多,线程安全各有各的说法,有没有更加有力的说法?
  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


公告

导航

随笔分类

最新随笔

最新评论

阅读排行榜