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 中实现单例模式,包括线程安全的懒汉式实现和直接初始化的饿汉式实现。

相关推荐
h_a_o777oah19 小时前
【动态规划】区间 DP :三层循环逻辑与模板实现细节(洛谷 P1880)
c++·算法·动态规划·acm·区间dp·化环为链·石子合并
QiLinkOS19 小时前
第三视觉理解徐玉生与他的商业活动(32)
大数据·c++·人工智能·算法·开源协议
geovindu19 小时前
java: Singleton Pattern
java·开发语言·后端·单例模式·设计模式·创建型模式
汉克老师19 小时前
GESP2026年6月认证C++一级( 第一部分选择题(8-15))精讲
c++·continue·运算符·while·break·gesp1级·模运算
鹏易灵20 小时前
C++——7.类与对象,掌握封装、继承、多态.详解
开发语言·c++·算法
初阳78520 小时前
【Qt】系统相关(2)——文件
开发语言·qt
Mortalbreeze20 小时前
深入 Linux 线程机制(三):线程互斥——竞争条件与互斥锁的本质
linux·运维·服务器·c++·算法
汉克老师20 小时前
GESP2026年6月认证C++一级( 第一部分选择题(1-7))精讲
c++·运算符·表达式·赋值·gesp1级·输入与输出·单循环
ALex_zry20 小时前
C++26 Freestanding 库扩展详解:无操作系统也能用标准库
java·jvm·c++
码上有光20 小时前
c++:map和set的底层实现
android·java·c++·set·map