您的位置:首页 > 其它

单例模式实现

2016-06-13 22:45 204 查看
这是一个单例模板类

#pragma once

template <typename T>
class CSingletonT
{
public:
static T *Instance()
{
return m_pObj;
}

class CDeconstructor
{
public:
CDeconstructor()
{
if (NULL == m_pObj)
{
m_pObj = new T();
}
}

~CDeconstructor()
{
if (CSingletonT::m_pObj)
{delete CSingletonT::m_pObj;
CSingletonT::m_pObj = NULL;
}
}
};

protected:
CSingletonT(void){}
virtual ~CSingletonT(void){}

protected:
static T * m_pObj;
static CDeconstructor m_dec;
};


使用的时候继承这个模板即可,比如:

#pragma once
#include "WebRef.h"
#include "SingletonT.h"

using Service1::CService1;

class CWebAccess : public CSingletonT<CWebAccess>
{
friend class CSingletonT<CWebAccess>;
friend class CSingletonT<CWebAccess>::CDeconstructor;
public:

CService1 *GetService();
void SetServiceUrl(const CString& strUrl);
protected:
CService1 m_service;
virtual ~CWebAccess(void){}
CWebAccess(void){}
};

CSingletonT<CWebAccess>::CDeconstructor CSingletonT<CWebAccess>::m_dec;
CWebAccess* CSingletonT<CWebAccess>::m_pObj = NULL;


模板类的两个static成要定义一下,头文件里只是声明。由于m_dec是静态成员,会在main函数执行之前构造,main退出后析构,所以这里使用这种特性来创建单例的实例变量,就可以不用锁来实现线程安全。一个良好的结构是main函数不会在main之前就有多线程的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: