首页 > 其他分享 >深入理解和实现Qt中的单例模式

深入理解和实现Qt中的单例模式

时间:2023-12-06 15:12:22浏览次数:31  
标签:Qt 示例 instance 深入 单例 MyClass Class QtSingletonTemplate

在Qt框架中,单例模式的实现是一个常见的需求,它有多种实现方式,每种都有其特点。以下是对这些方法的探讨,包括宏定义方式、模板类方式,以及Qt的内置单例宏,并附有具体的使用示例。

宏定义方式的单例模式

宏定义方式是一种传统且直接的实现单例模式的方法,但它可能导致代码重复和类型安全性问题。以下是一个宏定义单例模式的示例:

宏定义示例:

// QtSingleton.h
#ifndef QTSINGLETON_H
#define QTSINGLETON_H

#include <QScopedPointer>
#include <QMutex>

#define SINGLETON_DECL(Class) \
    public: \
        static Class *Instance(); \
    private: \
        Q_DISABLE_COPY(Class) \
        static QScopedPointer<Class> self;

#define SINGLETON_IMPL(Class) \
    QScopedPointer<Class> Class::self; \
    Class *Class::Instance() { \
        if (self.isNull()) { \
            static QMutex mutex; \
            QMutexLocker locker(&mutex); \
            if (self.isNull()) { \
                self.reset(new Class); \
            } \
        } \
        return self.data(); \
    }

#endif // QTSINGLETON_H

使用示例:

// MyClass.h
class MyClass {
    // MyClass 定义
};

// MyClass.cpp
SINGLETON_IMPL(MyClass)

// 使用单例
MyClass* instance = MyClass::Instance();

模板类方式的单例模式

模板类方式提供了更高的灵活性、类型安全性和代码重用性。以下是使用模板类实现单例模式的示例:

模板类示例:

// QtSingletonTemplate.h
#ifndef QTSINGLETONTEMPLATE_H
#define QTSINGLETONTEMPLATE_H

#include <QScopedPointer>
#include <QMutex>

template<typename T>
class QtSingletonTemplate {
public:
    static T* Instance() {
        if (m_instance.isNull()) {
            static QMutex mutex;
            QMutexLocker locker(&mutex);
            if (m_instance.isNull()) {
                m_instance.reset(new T);
            }
        }
        return m_instance.data();
    }

private:
    QtSingletonTemplate() = default;
    ~QtSingletonTemplate() = default;
    QtSingletonTemplate(const QtSingletonTemplate &) = delete;
    QtSingletonTemplate& operator=(const QtSingletonTemplate &) = delete;

    static QScopedPointer<T> m_instance;
};

template<typename T>
QScopedPointer<T> QtSingletonTemplate<T>::m_instance;

#endif // QTSINGLETONTEMPLATE_H

使用示例:

// MyClass.h
class MyClass {
    // MyClass 定义
};

// 使用单例
MyClass* instance = QtSingletonTemplate<MyClass>::Instance();

Qt内置单例宏

Qt的 Q_GLOBAL_STATIC 宏提供了一个简洁且线程安全的单例实现方式,非常适合需要全局访问的对象。

内置宏示例:

class MyClass {
public:
    void myFunction();
    // ... 其他成员 ...
};

Q_GLOBAL_STATIC(MyClass, myGlobalInstance)

void someFunction() {
    myGlobalInstance()->myFunction();
}

使用示例:

// 在任何需要的地方
myGlobalInstance()->myFunction();

每种方法都有其适用场景和优缺点。宏定义方式适合快速实现单例,但可能导致代码重复;模板类方式更灵活、安全,适合多类单例场景;而Qt内置单例宏简洁且线程安全,适用于全局单例对象。开发者可以根据项目需求和上下文选择最合适的实现方式。

标签:Qt,示例,instance,深入,单例,MyClass,Class,QtSingletonTemplate
From: https://www.cnblogs.com/linxmouse/p/17879587.html

相关文章

  • MQTT I/O模块:锂电池生产数据安全的坚实保障
    锂电池的生产工艺分为前、中、后三个阶段:其中后段则是检测封装,核心工序为化成、分容。分容是对电池进行一定充放电检测,将电池按容量分类的过程,后工序分档是通过对电池各项性能和产品指标进行检验(容量、电压、内阻、K值、厚度、外观等),将电池按照产品等级标准分开的过程。I/O模块应用......
  • Qt/C++视频监控拉流显示/各种rtsp/rtmp/http视频流/摄像头采集/视频监控回放/录像存储
    一、前言本视频播放组件陆陆续续写了6年多,一直在持续更新迭代,视频监控行业客户端软件开发首要需求就是拉流显示,比如给定一个rtsp视频流地址,你需要在软件上显示实时画面,其次就是录像保存,再次就是一些周边的处理比如贴OSD,做图片分析等。拉流显示是第一步,如果有跨平台的需求,个人推荐......
  • QT学习笔记-QTimer
    官方解释:TheQTimerclassprovidesrepetitiveandsingle-shottimers这个类提供了可重复的和单次的定时器。QTimer类为定时器提供了高级编程接口。使用:创建一个QTimer将timeout()信号连接到适当的槽,然后调用start()。完成1,2步后,它会以恒定的时间间隔发出timeout()信号......
  • 深入探讨Guava的缓存机制
    第1章:引言大家好,我是小黑,今天咱们聊聊GoogleGuava的缓存机制。缓存在现代编程中的作用非常大,它能提高应用性能,减少数据库压力,简直就是性能优化的利器。而Guava提供的缓存功能,不仅强大而且使用起来非常灵活。在咱们深入挖掘之前,先简单说说缓存。缓存,其实就是一种保存数据的手段......
  • Qt 项目打包成exe可执行程序
    1、先构建release2、删掉文件夹内多余的文件3、使用windeployqt工具再打包就可以了......
  • c++ json的解析和QT中json的操作
    1.下载jsoncpp源码2.首先建议jsoncpp源码编译成动态库https://www.bilibili.com/video/BV1pb4y1W7ZZhttps://www.bilibili.com/video/BV1Ra4y1e7gL (1)用QT的Cmake工具 (2)用Visualstudio a.工具打开jsoncpp源码,在CMakeLists.txt右键->jsoncpp的CMak......
  • 深入了解Linux文件权限
     在Linux系统中,文件权限是保障系统安全性和数据完整性的关键之一。本文将深入讨论Linux文件权限的各个方面,包括基本权限(UGO权限)、基本权限以外的ACL权限、高级权限、文件属性(chattr)以及客户端查询方法。基本权限(UGO权限)在Linux中,每个文件和目录都有一个拥有者(User)、一个用户组(Gro......
  • 深入了解Socks5代理技术
    代理服务器的安全性,防范潜在的攻击。三、Socks5代理的应用场景:Socks5代理由于其灵活性和高度定制化的特性,在多种场景下得到了广泛应用:匿名浏览:用户可以通过Socks5代理实现匿名浏览,隐藏真实IP地址,提高个人隐私保护水平。越境访问:在一些地区或网络环境受限的情况下,Socks5代理可以用......
  • 深入探讨 Python 中的装饰器和上下文管理器
    Python作为一门灵活而强大的语言,提供了许多高级特性,其中装饰器(Decorators)和上下文管理器(ContextManagers)是其中两个非常有用的概念。这两个功能性特性提供了对代码结构和行为进行修改和控制的强大工具。它们允许程序员在不修改源代码的情况下,添加、修改或扩展函数或类的功能,帮助......
  • C语言--深入理解指针
    C语言--深入理解指针一.指针的概念要知道指针的概念,要先了解变量在内存中是如何存储的。在存储时,内存被分为一块一块的,每一块都有一个特有的编号。而这个编号可以暂时理解为指针,就是酒店的门牌号一样。变量和地址看下面代码voidmain(){intx=10,inty=20;}代......