C++ QT 单例模式

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

1. 饿汉式单例模式

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

复制代码
// MySingleton.h
#ifndef MYSINGLETON_H
#define MYSINGLETON_H

#include <QObject>

class MySingleton : public QObject
{
    Q_OBJECT

public:
    // 获取单例实例的静态方法
    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_OBJECT

public:
    // 获取单例实例的静态方法
    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 中实现单例模式,包括线程安全的懒汉式实现和直接初始化的饿汉式实现。

相关推荐
AC赳赳老秦1 小时前
采集行为合规自检:OpenClaw 自动校验 robots 协议与采集频率,规避违规采集风险
java·开发语言·c++·python·php·deepseek·openclaw
无名猿2 小时前
C++ 查找算法:std::find 与容器成员 find 的性能差距
c++·性能优化·stl·标准库
程序猿编码2 小时前
工业视觉多任务方案:可编程梯度信息视觉框架,训练评估 + C++ 部署完整实战
开发语言·c++·视觉·推理引擎
朝朝辞暮i3 小时前
C++ 第 21 课:struct —— 把一组相关数据打包在一起
开发语言·c++·算法
SHARK_pssm4 小时前
【C++——类和对象(下)】
开发语言·c++·经验分享·笔记
汉克老师5 小时前
GESP2026年9月认证C++二级( 第一部分选择题(1~7题)精讲
c++·gesp·小学生·学c++编程
沫璃染墨5 小时前
《从零入门Linux系统篇(五十四):线程篇·七——互斥锁底层原理:从原子交换到线程竞争与锁实现》
linux·运维·服务器·开发语言·c++·驱动开发·系统架构
可乐ea7 小时前
GitHub Security Lab 开源 Fuzzing Taskflow:让 LLM 智能体自己跑完 C/C++ 模糊测试
jvm·c++·github·模糊测试·mcp·代码agent·智能体自动化
朝朝辞暮i7 小时前
C++ 第 13 课:值传递 —— 为什么函数里改了,外面却没变?
java·c++·算法
无忧.芙桃8 小时前
C++语言原理与实践(十):vector类的底层实现
开发语言·c++·算法