一个通用的单体模板

原文地址:

http://www.azure.com.cn/article.asp?id=206

 

#include <cassert.h>

template<typename T> class Singleton
{
 static T* ms_Singleton;

public:

 Singleton( void )
 {
     assert( !ms_Singleton);
     int offset = (int)(T*)1 - (int)(Singleton<T>*)(T*)1;
     ms_Singleton = (T*)((int)this + offset);
 }
 ~Singleton(void)
 { assert(ms_Singleton); ms_Singleton = 0;}
 static T& GetSingleton(void)
 { assert(ms_Singleton); return (*ms_Singleton); }
 static T* GetSingletonPtr(void)
 { return ms_Singleton; }
};

template<typename T> T* Singleton<T>::ms_Singleton = 0;


以下是使用该类的例子:

class TextureMgr : public Singleton<TextureMgr>
{
 public:
     Texture* GetTexture(const char* name);
}
再加个简单实例:
template <class T >
class Singleton
{
    public:
        static T& get_instance() {
            if(!m_singleton)
                m_singleton = new T();
            return *m_singleton;
        }
        static void del_instance(){
            if(m_singleton) {
                delete m_singleton;
                m_singleton = NULL;
            }
        }
    private:
        static T* m_singleton;
};
template<class T >
T* Singleton<T>::m_singleton;
以下是使用该类的例子:
class OnlineTaskManager
{
    public:
        virtual ~OnlineTaskManager();
    private:
        friend class Singleton<OnlineTaskManager>;
        OnlineTaskManager();
};
#define online Singleton<OnlineTaskManager>::get_instance()
建议读读Modern C++ Design相关章节.
并使用ACE::Singleton, 不要再造轮子(还是三角形的!).
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值