原文地址:
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;
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);
}
{
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 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();
};
{
public:
virtual ~OnlineTaskManager();
private:
friend class Singleton<OnlineTaskManager>;
OnlineTaskManager();
};
#define online Singleton<OnlineTaskManager>::get_instance()
建议读读Modern C++ Design相关章节.
并使用ACE::Singleton, 不要再造轮子(还是三角形的!).
并使用ACE::Singleton, 不要再造轮子(还是三角形的!).