最近开发一个项目,用到了单例模式,头文件大概如下
class CRecGuard
{
public:
CRecGuard(){::InitializeCriticalSection(&cs);Guard();}
~CRecGuard(){UnGuard();::DeleteCriticalSection(&cs);}
private:
void Guard(){::EnterCriticalSection(&cs);}
void UnGuard(){::LeaveCriticalSection(&cs);}
private:
CRITICAL_SECTION cs;
};
template <class T>
class CSingleton
{
public:
static inline T* instance();
private:
CSingleton(){} //禁止构造函数
~CSingleton(){} //禁止虚构函数
CSingleton(const CSingleton&){} //禁止复制构造函数
CSingleton & operator= (const CSingleton &){} //禁止赋值拷贝函数
static CRecGuard _gd;
static auto_ptr<T> _instance;
};
template <class T>
auto_ptr<T> CSingleton<T>::_instance;
template <class T>
CRecGuard CSingleton<T>::_gd;
template <class T>
inline T* CSingleton<T>::instance()
{
if(0 == _instance.get())
{
CRecGuard _gd;
if(0 == _instance.get())
{
_instance.reset(new T);
}
}
return _instance.get();
}
其它的东西都比较好理解,就是“禁止复制构造函数”和“禁止赋值拷贝函数”这两个东西,因为这个东西在之前写代码中没怎么用到,于是就是百度一下,于是了解到了“复制构造函数”和“赋值拷贝函数”,赋值拷贝函数和复制构造函数都是用已存在的B对象来创建另一个对象A。不同之处在于:赋值运算符处理两个已有对象,即赋值前B应该是存在的;复制构造函数是生成一个全新的对象,即调用复制构造函数之前A不存在。
CTemp a(b); //复制构造函数,C++风格的初始化
CTemp a=b; //仍然是复制构造函数,不过这种风格只是为了与C兼容,与上面的效果一样
在这之前a不存在,或者说还未构造好。
CTemp a;
a=b; //赋值拷贝函数
在这之前a已经通过默认构造函数构造完成。
知道这两个东西的意思以后,上面的代码就很好理解了,这两个函数后面的{}部分都是空的,这样就起到了禁止的作用。