C++ QT 单例模式

devtools/2024/9/23 12:28:41/

在 C++ 中,使用 Qt 框架实现单例模式可以确保一个类只有一个实例,并提供一个全局访问点。以下是一个简单的 C++ Qt 单例模式实现示例。

1. 饿汉式单例模式

饿汉式单例模式在类加载时就初始化单例对象。

// MySingleton.h
#ifndef MYSINGLETON_H
#define MYSINGLETON_H#include <QObject>class MySingleton : public QObject
{Q_OBJECTpublic:// 获取单例实例的静态方法static MySingleton& instance(){static MySingleton instance;return instance;}// 禁止拷贝构造和赋值MySingleton(const MySingleton&) = delete;MySingleton& operator=(const MySingleton&) = delete;signals:// 可以定义一些信号public slots:// 可以定义一些槽函数private:// 私有构造函数和析构函数MySingleton() {}~MySingleton() {}
};#endif // MYSINGLETON_H

2. 懒汉式单例模式

懒汉式单例模式在第一次调用 instance() 时才初始化单例对象。

// MySingleton.h
#ifndef MYSINGLETON_H
#define MYSINGLETON_H#include <QObject>
#include <QMutex>
#include <QScopedPointer>class MySingleton : public QObject
{Q_OBJECTpublic:// 获取单例实例的静态方法static MySingleton& instance(){static QMutex mutex;if (!m_instance){QMutexLocker locker(&mutex);if (!m_instance){m_instance.reset(new MySingleton());}}return *m_instance;}// 禁止拷贝构造和赋值MySingleton(const MySingleton&) = delete;MySingleton& operator=(const MySingleton&) = delete;signals:// 可以定义一些信号public slots:// 可以定义一些槽函数private:// 私有构造函数和析构函数MySingleton() {}~MySingleton() {}static QScopedPointer<MySingleton> m_instance;
};#endif // MYSINGLETON_H
// MySingleton.cpp
#include "MySingleton.h"QScopedPointer<MySingleton> MySingleton::m_instance(nullptr);

3. 使用示例

在任何地方使用单例:

#include "MySingleton.h"// 获取单例实例
MySingleton& singleton = MySingleton::instance();

关键点总结:

线程安全:Qt 中提供了 QMutex 和 QMutexLocker 来确保线程安全。
防止拷贝:通过删除拷贝构造函数和赋值运算符来防止拷贝。
全局访问:通过 instance() 方法获取单例实例。
示例展示了如何在 Qt 中实现单例模式,包括线程安全的懒汉式实现和直接初始化的饿汉式实现。


http://www.ppmy.cn/devtools/100194.html

相关文章

回归分析系列20— 模型选择与模型验证

25 模型选择与模型验证 25.1 简介 在统计建模中,模型选择与验证是关键步骤。这一过程旨在找到最适合数据的模型,并通过交叉验证或其他方法验证其性能。模型选择通常包括选择特征、模型类型以及调整超参数,而模型验证则通过测试数据评估模型的泛化能力。 25.2 模型选择的原…

Android中apk安装过程源码解析

本文中使用的Android源码基于Android 14 1 三方应用安装apk调用方法 public void installApk() {Intent intent new Intent(Intent.ACTION_VIEW);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);/** 自Android N开始&#xff0c;是通过FileProvider共享相关文件&#xff0…

微服务健康检查:如何通过Eureka实现服务自动剔除与恢复

微服务健康检查&#xff1a;如何通过Eureka实现服务自动剔除与恢复 引言 随着微服务架构的广泛应用&#xff0c;如何保证服务的高可用性和系统的稳定性成为了架构设计中的重要考量。服务注册与发现是微服务架构中的关键组件&#xff0c;它们确保了微服务能够被其他服务发现并…

使用 setResponseStatus 函数设置响应状态码

title: 使用 setResponseStatus 函数设置响应状态码 date: 2024/8/25 updated: 2024/8/25 author: cmdragon excerpt: 通过 setResponseStatus 函数,你可以轻松地在 Nuxt.js 中设置响应的状态码。这不仅能帮助用户更好地理解发生了什么,还能在需要时显示自定义的错误页面。…

OpenCV几何图像变换(3)计算透视变换矩阵函数getPerspectiveTransform()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算四对对应点之间的透视变换。 该函数计算 33 的透视变换矩阵&#xff0c;使得&#xff1a; [ t i x i ′ t i y i ′ t i ] map_matrix ⋅ …

创建新进程,system函数及其底层逻辑

创建新进程 exec函数 与fork不同&#xff0c;exec函数不是创建调用进程的子进程&#xff0c;而是创建一个新的进程取代调用进程自身。新进程会用自己的全部地址空间&#xff0c;覆盖调用进程的地址空间但进程的PID保持不变 exec不是一个函数而是一堆函数(共6个)&#…

windows C++-WRL 处理事件

本文档演示如何使用 Windows 运行时 C 模板库 (WRL) 订阅和处理 Windows 运行时对象的事件。 订阅处理事件流程 以下步骤启动对象 ABI::Windows::System::Threading::IDeviceWatcher&#xff0c;并使用事件处理程序监视进度。 通过接口 IDeviceWatcher&#xff0c;可以在添加…

C++ | 继承

前言 本篇博客讲解c中的继承 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&…