网上看了很多 Singleton 的实现,用到的技巧很多,特别是 auto_ptr 的应用,但是在实际项目中,总有些用的不顺手。改了改,如下实现
#define SingletonTemplate( T ) /
/
protected: /
static T* _instance; /
/
public: /
static T* GlobalInstance() /
{ /
if( NULL == _instance ) /
_instance = new T; /
/
return _instance; /
}
#define GInstance(T) T::GlobalInstance()
#define DefineInstance(T) T* T::_instance = NULL;
class Singleton
{
friend class SingletonsManager;
protected:
Singleton() { SingletonsManager::Add( this ); }
virtual ~Singleton(){}
};
class SingletonsManager
{
public:
static void Free(); // 释放所有Singleton 对象
static void Add( Singleton* singleton );
protected:
static vector<Singleton*> _allInstances;
};
class Test : public Singleton
{
SingletonTemplate( Test );
public:
void Do();
};
// 使用方式 GInstance(Test)->Do();
// 程序结束 SingletonsManager::Free();
// 随手写的代码,没有在机器上调试,不知道是否有错误,实际操作中我就是这样用的。