Qt中单例模式的实现(4种方法)
2024-10-05 16:31:22
最简单的写法:
1 |
static MyClass* MyClass::Instance() |
过去很长一段时间一直都这么写,简单粗暴有效。但是直接声明静态对象会使编译出的可执行文件增大,也有可能出现其他的一些问题,所以利用了Qt自带的智能指针QScopedPointer
和线程锁QMutex
,改成了需要时才动态初始化的模式:
1 |
static MyClass* MyClass::Instance() |
既保证了线程安全又防止了内存泄漏,效率也没降低太多,简直完美。
可惜每次都要重复这么几行实在麻烦,于是写了一个模板类:
1 |
template <class T> |
使用的时候直接这样——
1 |
MyClass* inst = Singleton<MyClass>::Instance(); |
除了用模板类,还可以利用c++中强大的宏:
1 |
#define DECLARE_SINGLETON(Class) \ |
然后声明的时候,填加一行这个宏:
1 |
class MyClass |
好评好评。
当然,为了要保证真的是单例模式,还要把构造函数限制为private,不然以后什么时候忘记了这码事,在外面又new了一下就不好了。
另外Qt本身自带了一个宏Q_GLOBAL_STATIC
,也有类似单例模式的效果,QThreadPool::globalInstance()
函数的实现就是利用了这个宏。不过它的主要用处是声明全局变量,和Singleton还是有差别的。
https://blog.yeatse.com/2015/03/03/qt-singleton-implementation/
最新文章
- 蒙特卡洛树搜索算法(UCT): 一个程序猿进化的故事
- mysql SQL_CALC_FOUND_ROWS
- Visual Studio中的快捷键
- Android开发之多级下拉列表菜单实现(仿美团,淘宝等)
- 【转】Android 属性动画(Property Animation) 完全解析 (上)
- Android小项目之二 代码的组织结构
- zedboard启动过程分析
- lintcode:Length of Last Word 最后一个单词的长度
- HDU 1576 A/B 扩展欧几里德算法
- linux下启动和关闭网卡命令及DHCP上网
- 表格(table) 插件:支持当前行增行、删除。使用事件委托
- 大数据系列修炼-Scala课程05
- WebIM(2)---消息缓存
- python模块之PIL模块
- ExtJS:Grid数据导出至excel实例
- 洛谷P1072 Hankson 的趣味题(题解)
- HDU - 6314 Matrix(广义容斥原理)
- PHP微信模板消息发送
- Hue添加MySQL数据库
- BZOJ1805[Ioi2007]Sail船帆——线段树+贪心
热门文章
- jquery优化01
- HDU1561 The more, The Better(树形DP)
- HDU3037 Saving Beans(Lucas定理+乘法逆元)
- DataTable排序的一般方法
- HDU 2896 (AC自动机模板题)
- 响应式HTML5+CSS3 网站开发测试实践
- 关于inf的问题
- 【BZOJ】1076: [SCOI2008]奖励关(状压dp+数学期望)
- [LintCode] Implement Trie 实现字典树
- [转载]CAsyncSocket及CSocket注解