当前位置: 首页 > news >正文

QT:单例

单例的定义

官方定义:单例是指确保一个类在任何情况下都绝对只有一个实例并提供一个全局访问点。

单例的写法

抓住3点:

  • 构造函数私有化(确保只有一个实例)
  • 提供一个可以获取构造实例的接口(提供唯一的实例)
  • 正常写你需要实现的函数

 举个例子

①就是构造函数私有化,把构造函数放在private

②就是提供一个可以获取实例的接口,这个实例就是私有变量_singleton

③就是正常需要实现的函数,正常咋写就咋写,但最好是独立的且需要多次被使用

用法

在需要使用单例的文件中添加单例的头文件

举个例子,我要在BlockFileTreeView中使用单例中的函数,那么我就在BlockFileTreeView.cpp中添加单例头文件

#include "ResourceTreeViewSingleton.h"

然后再需要调用函数的地方通过单例的init获取实例,然后调用需要使用的函数

filePath = _fileLocalPath + ResourceTreeViewSingleton::init()->getRelativePath(_currentProcessItem,"");
重点就是这句ResourceTreeViewSingleton::init()->getRelativePath(_currentProcessItem,"");

红色部分是获取单例的实例,黄色部分就是调用单例的函数。

单例代码

.h

#ifndef RESOURCETREEVIEWSINGLETON_H
#define RESOURCETREEVIEWSINGLETON_H#include <QSharedPointer>
#include <QMutex>
#include <QStandardItem>
#include <QFileInfo>
class ResourceTreeViewSingleton: public QObject
{Q_OBJECT
public:~ResourceTreeViewSingleton() override;static QSharedPointer<ResourceTreeViewSingleton>& init();static void doDeleteLater(ResourceTreeViewSingleton *obj);static void releaseThis();// 单例类中需要实现的函数bool isDirVisible(QString text);QString changeUnit(const qint64 &size);QString changeQStringSize(const QString &size);bool isFile(QStandardItem * item);QString getRelativePath(QStandardItem *item, QString relativePath);QList<QStandardItem *> queryStandardItem(QStandardItem *topItem);QList<QStandardItem *> queryStandardItemPush(QStandardItem *topItem);bool saveFile(const QString &filePath, const QString &text);QString getDefaultDeviceName(const QStandardItem *item, const QFileInfo &fileInfo);
private:explicit ResourceTreeViewSingleton(QObject *parent = nullptr);static QSharedPointer<ResourceTreeViewSingleton > _singleton;static QMutex _mutex;
};#endif // RESOURCETREEVIEWSINGLETON_H

.cpp

#include "ResourceTreeViewSingleton.h"
#include <QMutexLocker>
#include <QStandardItem>
QMutex ResourceTreeViewSingleton::_mutex;
QSharedPointer<ResourceTreeViewSingleton> ResourceTreeViewSingleton::_singleton;ResourceTreeViewSingleton::ResourceTreeViewSingleton(QObject *parent): QObject(parent)
{}ResourceTreeViewSingleton::~ResourceTreeViewSingleton()
{}void ResourceTreeViewSingleton::doDeleteLater(ResourceTreeViewSingleton *obj)
{obj->deleteLater();
}
void ResourceTreeViewSingleton::releaseThis()
{_singleton.clear();
}QSharedPointer<ResourceTreeViewSingleton> &ResourceTreeViewSingleton::init()
{//初始化决定了它所在的线程if (_singleton.isNull()){QMutexLocker mutexLocker(&_mutex);if (_singleton.isNull()){//发现 doDeleteLater 会崩溃_singleton = QSharedPointer<ResourceTreeViewSingleton>(new ResourceTreeViewSingleton()/*,doDeleteLater*/);}}return _singleton;
}//下面写需要实现的正常函数

http://www.lryc.cn/news/277555.html

相关文章:

  • IPv6路由协议---IPv6动态路由(OSPFv3-4)
  • 移动通信原理与关键技术学习(4)
  • 第二百五十八回
  • freesurfer-reconall后批量提取TIV(颅内总体积)
  • 【GO】如何用 Golang 的 os/exec 执行 pipe 替换文件
  • 基于Spring-boot-websocket的聊天应用开发总结
  • 2023年度总结 - 职业生涯第一个十年
  • setup 语法糖
  • Javaweb之Mybatis的基础操作的详细解析
  • 知名开发者社区Stack Overflow发布《2023 年开发者调查报告》
  • vue element plus Form 表单
  • zmq_connect和zmq_poll
  • TinyLog iOS v3.0接入文档
  • react-native 配置@符号绝对路径配置和绝对路径没有提示的问题
  • element的Table表格组件树形数据与懒加载简单使用
  • 游戏、设计选什么内存条?光威龙武系列DDR5量大管饱
  • linux磁盘清理_docker/overlay2爆满
  • Redis过期清理策略和内存淘汰机制
  • 2_并发编程同步锁(synchronized)
  • Python 常用模块pickle
  • CentOS 6 制作openssh 9.6 p1 rpm包(含ssh-copy-id、openssl) —— 筑梦之路
  • Tomcat Notes: Deployment File
  • 某邦通信股份有限公司IP网络对讲广播系统挖矿检测脚本
  • uniapp点击跳转传对象
  • 简单用PHP实现微信小程序的游戏功能
  • 某查查请求头参数加密分析(含JS加密算法与Python爬虫源码)
  • 免费用chatGPT
  • 还不会python 实现常用的数据编码和对称加密?看这篇文章就够啦~
  • 简易实现 MyBatis 底层机制
  • PhpPythonC++圆类的实现(OOP)