QT 使用单例模式

这篇具有很好参考价值的文章主要介绍了QT 使用单例模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. 单例模式介绍

2.单例模式实现


QT 使用单例模式,编程语言,嵌入式,C++,单例模式

 

1. 单例模式介绍

   有些时候我们在做 qt 项目的时候,要用到很多类. 例如我们用到的类有 A,B,C,D. 其中,A 是 B,C,D 中都需要用到的类,A 类非常的抢手. 但是,A 类非常的占内存,定义一个 A 对象需要 500M 内存,假如在 B,C,D 中都定义一个 A 类对象,对 内存的消耗是可想而知的.

所以 B,C,D 分别都定义一个 A 类对象是不可能的. 那么我们此时就希望: 能不能把 A 定义成"全局变量",然后这样子 B,C,D 类都能访问,并且整个程序就只有这一个 A?

答案是可以的,定义 A 的时候以单例模式定义即可

单例模式作为一种常用的软件设计模式,主要是用来保证系统中只有一个实例,例如一般一个程序中只有一 个日志输出实例,一个系统中只有一个数据库连接实例,这时候用单例模式非常合适。

单例模式用来做什么

正如之前所说,单例模式:

(1) 整个程序只有一个对象;

(2) 整个程序都能访问到它;

(3) 分为"懒汉模式"和"饿汉模式";

(4) "懒汉模式"是用到单例的时候才创建,否则不创建对象;

(5) "饿汉模式"是在程序启动时就需要创建变量;

懒汉模式是时间换空间,饿汉模式是空间换时间。

单例模式是在大型项目用到非常多的,例如:

(1) 一个日记记录类,必须整个程序只能有一个,假如有 2 个,在写日志文件时会相互"践踏".

(2) 数据库操作,连接类,必须整个程序只能有一个,假如有 2 个就会出问题,你想看假如 2 个进程同时使用 同一个账号,然后写入同一个数据会发生什么事情...

单例模式有效的解决了重复定义对象的问题,假如配合互斥锁,还可以解决多进程,线程之间的同步互斥问题, 也就是同一时间只能有一个进程操作单例对象。

2.单例模式实现

设计单例模式非常简单:

cpp文件实例:

//这句一定要写,因为 self 是静态变量,必须要初始化值
ClassA* ClassA::self = NULL;
ClassA *ClassA::getInstance()
{
 //判断是否是第一次调用
 //假如不为 NULL,会直接 return
 if (self == NULL) {
 //防止多进程同时调用创建 2 个对象的问题
 //原理是因为是静态变量只会定义一次
 static QMutex mutex;
 //上锁
 QMutexLocker locker(&mutex);
 //在判断一次,防止其它进程抢先 new 过了
 if (self == NULL) {
 self = new ClassA;
 }
 }
 return self; //返回指针
}

h头文件实例:

class ClassA : public QObject
{
 Q_OBJECT
public:
 //通过它获取 self 指针,这个函数是静态调用,不需要创建对象就可以访问
 static ClassA *getInstance(); //返回自身的指针
 //构造函数
 explicit ClassA(QObject *parent = 0);
 void hello(){ //一个普通函数
 qDebug() << "hello world";
 }
private:
 static ClassA *self; //静态指针
};
#endif // ICONFONT_H

在其他类里的调用方法:

ClassA::getInstance()->hello();

 其中:

     ClassA::getInstance()会获取全局的 self 指针,通过这个指针我们可以访问到里边的函数。在任何类里,都可以 无条件访问 A 对象,并且不需要创建 A 对象,而且 A 对象全局只有一个实例:

(1) 在类 A 里定义一个静态的指针 self;

(2) 当调用获取 A 对象的指针时,判断这个 self 是否为空,假如为空则创建新对象并赋值给 self 并返回 self,存 在则直接返回 self;

在此使用用的最多的"懒汉模式"进行演示:

cpp 代码如下(以数据库为例(多个 ui 界面都使用到此类)):

#include "qmqttclient.h"
#include <QMutex>
#include <QMutexLocker>
#include <QMessageBox>
//构造函数
QmqttClient::QmqttClient()
{
 
}
//这句一定要写,因为 self 是静态变量,必须要初始化值
QmqttClient* QmqttClient::mqttSelf = NULL;
QmqttClient *QmqttClient::getInstance()
{
 //判断是否是第一次调用
 //假如不为 NULL,会直接 return
 if (mqttSelf == NULL) {
 //防止多进程同时调用创建 2 个对象的问题
 //原理是因为是静态变量只会定义一次
 static QMutex mutex;
 //上锁 QMutexLocker 会锁住 mutex,当 QMutexLocker 被释放的时候自动解锁
 //locker 是局部变量,所以 getInstance 函数结束时会自动解锁
 QMutexLocker locker(&mutex);
 //在判断一次,防止其它进程抢先 new 过了
 if (mqttSelf == NULL) {
 mqttSelf = new QmqttClient;
 }
 }
 return mqttSelf; //返回指针
}

头文件

#ifndef QMQTTCLIENT_H
#define QMQTTCLIENT_H
#include <QObject>
#include "qmqtt.h"
#include <QtCore>
class QmqttClient : public QObject{
 Q_OBJECT
public:
 //通过它获取 self 指针,这个函数是静态调用,不需要创建对像就可以访问,函数名
自定义
 //这个函数的作用是给别人获取它的静态对象 返回自身的指针
 static QmqttClient *getInstance();
// void hello(){ //一个普通函数
// qDebug() << "hello world";
private:
 QmqttClient(); //构造函数,写在 private 下,不允许 new 生成单例
 static QmqttClient *mqttSelf;//静态指针
};

在其他类里的调用方法:

QmqttClient::getInstance()->mqttClient->setHost(ui->lEditServerIP->text()); //服务 器 IP QmqttClient::getInstance()->mqttClient->setPort(1883);//端口号

 其中: QmqttClient::getInstance()会获取全局的 self 指针,通过这个指针我们可以访问到里边的函数. 在任何类里,都可以无条件访问 A 对象,并且不需要创建 A 对象,而且 A 对象全局只有一个实例: 注意:可以把多个对象放到单例模式文章来源地址https://www.toymoban.com/news/detail-628380.html

到了这里,关于QT 使用单例模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 中文编程开发语言工具编程实际案例:台球棋牌混合计时计费软件使用的编程构件说明

    台球棋牌混合计时计费软件使用的编程构件说明 上图说明:该软件可以用于桌球和棋牌同时计时计费,在没有开台的时候,图片是处于等待状态,这使用编程工具中的固定图像构件,在正在计时的时候,图片自动变换为 进行中的状态,在编程中可以动态读取图片。 上图说明

    2024年02月08日
    浏览(52)
  • 使用C++编写自己的编程语言CASM

    CASM帮助文档: CASM解释器讲解视频: 我独自开发了一种编程语言:CASM CASM解释器源代码(剪贴板有问题,总是粘贴成一行,哪位大佬帮帮我……): #include iostream #include cstring #include string #include cstdio #include map #include queue #include stack #include cstdlib #include list #include \\\"hint.hpp\\\" us

    2024年02月10日
    浏览(50)
  • QT 使用单例模式

    目录 1. 单例模式介绍 2.单例模式实现      有些时候我们在做 qt 项目的时候,要用到很多类. 例如我们用到的类有 A,B,C,D. 其中,A 是 B,C,D 中都需要用到的类,A 类非常的抢手. 但是,A 类非常的占内存,定义一个 A 对象需要 500M 内存,假如在 B,C,D 中都定义一个 A 类对象,对 内存的消耗

    2024年02月14日
    浏览(30)
  • 使用c语言编程时输入具体的年份和月份,求月份的天数的两种编程方法

    方法一:使用if……else语句  方法二:使用switch语句 考虑到一些读者需要相关资料和解决一些疑问,因此我新建立了一个学习交流群,我在群文件里上传了一些资料,需要的读者可以入群下载。 群中文件资料我会时常更新,主要资料是51单片机开发、32单片机开发、编程、嵌

    2024年02月11日
    浏览(61)
  • Qt使用单例模式读取xml文件

    单例模式是指在整个系统生命周期内,保证一个类只能产生一个实例,确保该类的唯一性。 1、节省资源。一个类只有一个实例,不存在多份实例,节省资源。 2、方便控制。在一些操作公共资源的场景时,避免了多个对象引起的复杂操作。 在程序中多次使用同一个对象且作

    2024年02月20日
    浏览(49)
  • python环境解析任意编程语言 tree-sitter使用方法(1)

    我个人目前仍在研究代码有关的知识。目前基于深度学习表征代码的论文越来越卷了,用到的工具越来越高级了。目前有一个开源项目tree-sitter,专门用于解析 具体语法树 ,声称: 足够通用 ,能用于任何编程语言 足够迅速 ,能在文本编辑器中响应每一个用户输入 足够鲁棒

    2024年02月09日
    浏览(40)
  • 使用Python编程语言处理数据 (Processing data using Python programm

    作者:禅与计算机程序设计艺术 Python作为一种高级、开源、跨平台的编程语言,已经成为当今最流行的数据分析和机器学习工具。本文介绍了使用Python编程语言处理数据的一些基础知识,如列表、字典、集合、迭代器等,并对pandas、numpy、matplotlib、seaborn等数据分析库进行了

    2024年02月07日
    浏览(47)
  • Linux系统编程,使用C语言实现简单的FTP(服务器/客户端)

    前言 跟着上官社长 陈哥花了一个月的时间终于把Linux系统编程学的差不多了,这一个月真的是头疼啊,各种bug,调的真心心累,不过好在问题都解决掉了,在此也感谢一下答疑老师,给我提供了很多的思路,本文章是对前段时间学习Linux,做一个小小的总结,才疏学浅,只学

    2024年02月12日
    浏览(70)
  • 编程语言:微软 Azure CTO 表示,是时候停止在新项目中使用 C 和 C++

    Azure CTO Mark Russinovich 说,业界应该将 C 和 C++ 语言视为“已弃用”。 Windows 11 22H2:如何获得微软最新的操作系统更新以及接下来会发生什么 Microsoft Azure 的首席技术官 Mark Russinovich 表示,出于安全性和可靠性的考虑,开发人员应避免在新项目中使用 C 或 C++ 编程语言,而应使用

    2024年02月06日
    浏览(53)
  • 在HBase中执行查询操作通常使用HBase Shell或编程语言API(如Java或Python)来执行

    在HBase中执行查询操作通常使用HBase Shell或编程语言API(如Java或Python)来执行。以下是使用HBase Shell进行查询的一些示例: 单行查询:获取指定行键的数据。 扫描表:按行范围获取表中的多个行的数据。 过滤器查询:使用过滤器指定查询条件来获取数据。 列族查询:获取指

    2024年01月21日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包