最近開發一個項目,用到了單例模式,頭文件大概如下 class CRecGuard{public: CRecGuard(){::InitializeCriticalSection(&cs);Guard();} ~CRecGuard(){UnGuard();::DeleteCriticalSection ...
最近開發一個項目,用到了單例模式,頭文件大概如下
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已經通過預設構造函數構造完成。
知道這兩個東西的意思以後,上面的代碼就很好理解了,這兩個函數後面的{}部分都是空的,這樣就起到了禁止的作用。