Qt 单例模式的实现(4种方法)
2023-09-14 09:07:02 时间
最简单的写法:
1 static MyClass* MyClass::Instance()
2 {
3 static MyClass inst;
4 return &inst;
5 }
过去很长一段时间一直都这么写,简单粗暴有效。但是直接声明静态对象会使编译出的可执行文件增大,也有可能出现其他的一些问题,所以利用了Qt自带的智能指针QScopedPointer和线程锁QMutex,改成了需要时才动态初始化的模式:
static MyClass* MyClass::Instance()
{
static QMutex mutex;
static QScopedPointer<MyClass> inst;
if (Q_UNLIKELY(!inst)) {
mutex.lock();
if (!inst) {
inst.reset(new MyClass);
}
mutex.unlock();
}
return inst.data();
}
既保证了线程安全又防止了内存泄漏,效率也没降低太多,简直完美。
可惜每次都要重复这么几行实在麻烦,于是写了一个模板类:
template <class T>
class Singleton
{
public:
static T* Instance()
{
static QMutex mutex;
static QScopedPointer<T> inst;
if (Q_UNLIKELY(!inst)) {
mutex.lock();
if (!inst) {
inst.reset(new T);
}
mutex.unlock();
}
return inst.data();
}
};
使用的时候直接这样——
MyClass* inst = Singleton<MyClass>::Instance();
除了用模板类,还可以利用c++中强大的宏:
#define DECLARE_SINGLETON(Class) \
Q_DISABLE_COPY(Class) \
public: \
static Class* Instance() \
{ \
static QMutex mutex; \
static QScopedPointer<Class> inst; \
if (Q_UNLIKELY(!inst)) { \
mutex.lock(); \
if (!inst) inst.reset(new Class); \
mutex.unlock(); \
} \
return inst.data(); \
}
然后声明的时候,填加一行这个宏:
1 class MyClass
2 {
3 DECLARE_SINGLETON(MyClass); // 声明单例模式
4 //...
5 }
好评好评。
当然,为了要保证真的是单例模式,还要把构造函数限制为private,不然以后什么时候忘记了这码事,在外面又new了一下就不好了。
另外Qt本身自带了一个宏Q_GLOBAL_STATIC,也有类似单例模式的效果,QThreadPool::globalInstance()函数的实现就是利用了这个宏。不过它的主要用处是声明全局变量,和Singleton还是有差别的。
相关文章
- qt创建线程的几种方式_创建一个新线程的方法
- 二、Qt定时器与文本编辑器制作《QT 入门到实战》
- C/C++ Qt QChart 绘图组件应用
- Windows设备信息获取:(摄像头,声卡为例)Qt,WindowsAPI对比说明(1)
- Ubuntu18.04下Qt出现qt.qpa.plugin:Could not load the Qt platform plugin “xcb“问题解决方法
- Linux串口应用开发实践——Qt篇(linux串口qt)
- Qt 5种标准对话框及使用方法详解
- Qt Assistant(Qt助手)查阅帮助文档(非常详细)
- bit打造理想QT环境:Linux 64位下的体验(qtlinux64)
- 如何在Linux下编译Qt?(linux下编译qt)
- 在Linux下探索Qt程序的奥秘(linux下运行qt程序)
- 分析Linux Qt实例分析:快速掌握开发技术(linuxqt实例)
- Linux下Qt移植的探索与实践(linux移植qt)
- QT and MySQL: A Comprehensive Tutorial for Building Database Connections(qt连接mysql教程)
- QT实现对Oracle数据库的操作教程(qt操作oracle)
- 编程使用Qt快速实现SQLServer数据库编程(qt中sqlserver)
- 在Linux下体验Qt的简便安装之旅(在linux下安装qt)
- Qt如何编译Oracle数据库驱动(qt编译oracle驱动)
- 使用Linux和Qt搭建强大的应用环境(linux qt 环境)
- MySQL和QT不配套使用,无法实现事务处理(mysql不支持qt事务)