Qt 中定义单例对象

本文介绍在Qt中如何利用Q_GLOBAL_STATIC宏定义单例对象,并解释了它带来的线程安全特性。提供了三种代码示例来展示宏的具体用法。

再Qt中定义单例对象,有一个专门的宏 Q_GLOBAL_STATIC。通过这个宏不但定义简单,还可以获得线程安全性。
关于这个宏的使用,见下面三种代码截图:
这里写图片描述

这里写图片描述

这里写图片描述

### 如何在 Qt 中实现模式 #### 使用饿汉式模式 一种简的方式是在类加载时就初始化对象,这种方式被称为饿汉式模式。通过静态成员变量和私有化构造函数来确保类的唯一实[^1]。 ```cpp #ifndef SINGLETON_H #define SINGLETON_H #include <QObject> class Singleton : public QObject { Q_OBJECT private: // 私有化构造函数以阻止外部实化 explicit Singleton(QObject *parent = nullptr); public: // 提供获取唯一实的方法 static Singleton& getInstance(); // 删除拷贝和赋值操作符以保证一实 Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; }; #endif // SINGLETON_H // .cpp 文件 #include "singleton.h" Singleton::Singleton(QObject *parent) : QObject(parent) {} Singleton& Singleton::getInstance() { static Singleton instance; // 静态局部变量,在第一次调用时创建并销毁于程序结束时 return instance; } ``` 此方法利用了 C++ 的静态局部变量特性,确保 `instance` 只会在首次调用 `getInstance()` 方法时被创建,并且它的生命周期贯穿整个程序运行期间[^5]。 #### 利用 QGlobalStatic 实现模式 另一种更高效的方式是借助 Qt 自带工具 `QGlobalStatic` 来管理单例对象的生命周期。这种方法延迟了对象的创建时间直到真正需要它为止[^2]。 ```cpp #ifndef SINGLETONGLOBAL_H #define SINGLETONGLOBAL_H #include <QObject> #include <QGlobalStatic> class SingletonGlobal : public QObject { Q_OBJECT private: // 构造函数设为私有 explicit SingletonGlobal(QObject *parent = nullptr); // 禁止复制和移动语义 SingletonGlobal(const SingletonGlobal &) = delete; SingletonGlobal &operator=(const SingletonGlobal &) = delete; friend class QGlobalStatic<SingletonGlobal>; }; extern Q_GLOBAL_STATIC(SingletonGlobal, globalInstance) #endif // SINGLETONGLOBAL_H // 访问全局实 void someFunction() { SingletonGlobal *instance = globalInstance(); } ``` 这里使用了宏定义 `Q_GLOBAL_STATIC` 创建了一个名为 `globalInstance` 的全局静态对象指针。任何地方都可以通过这个指针安全地访问到唯一的 `SingletonGlobal` 对象实。 #### 结合智能指针实现线程安全模式 为了进一步增强安全性以及资源管理能力,还可以采用智能指针配合设计思路: ```cpp #ifndef SMARTSINGLETON_H #define SMARTSINGLETON_H #include <QObject> #include <QSharedPointer> class SmartSingleton : public QObject { Q_OBJECT private: // 将构造函数设置成私有的形式 explicit SmartSingleton(QObject *parent = nullptr); // 禁止拷贝行为 Q_DISABLE_COPY_MOVE(SmartSingleton) public: // 获取当前类的唯一实 static QSharedPointer<SmartSingleton> instance(); private: static QSharedPointer<SmartSingleton> m_instance; }; #endif // SMARTSINGLETON_H // .cpp 文件 #include "smartsingleton.h" QSharedPointer<SmartSingleton> SmartSingleton::m_instance; QSharedPointer<SmartSingleton> SmartSingleton::instance(){ if (m_instance.isNull()) { m_instance.reset(new SmartSingleton()); } return m_instance; } SmartSingleton::SmartSingleton(QObject *parent): QObject(parent){} ``` 上述代码片段展示了如何结合 `QSharedPointer` 进行内存管理和自动释放机制下的模式实现[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值