单例模式实现
2016-06-13 22:45
204 查看
这是一个单例模板类
使用的时候继承这个模板即可,比如:
模板类的两个static成要定义一下,头文件里只是声明。由于m_dec是静态成员,会在main函数执行之前构造,main退出后析构,所以这里使用这种特性来创建单例的实例变量,就可以不用锁来实现线程安全。一个良好的结构是main函数不会在main之前就有多线程的。
#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之前就有多线程的。
相关文章推荐
- 第3章 体会和表达感受
- 关于arguments对象的一些用法
- Maven nexus 安装nexus私服出现的两个问题
- iOS开发小技巧-修改SliderBar指针的样式(牢记这个方法,只能通过代码来修改)
- Makefile实例print "hello world"
- LeetCode-104 Maximum Depth of Binary Tree
- zabbix Trapper 监控项配置
- zabbix Trapper 监控项配置
- 改变窗口所在的进程:android:process属性解析
- 对于Android开发中Eclipse出现的“heap space”的问题
- 2016第25周一
- Unsupported major.minor version 51.0 错误解决方案
- 文件权限管理 - chmod,chown,chgrp
- mysql创建索引
- opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像
- POJ-3126-Prime Path(BFS)
- 基础篇—if和三元运算的区别
- 基于语音信号MFCC的情感识别
- 浅谈Linux中的crond
- 垂直居中的几种方法(转)