「QT」高阶篇 之 d-指针 的用法

news2024/12/23 4:44:48

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「QT」QT5程序设计
📚全部专栏
「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合
「C/C++」C/C++程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定制开发
「Py」Python程序设计「Math」探秘数学世界「PK」Parasolid函数说明

目录

    • Qt中的d-pointer(d-指针)与QSharedDataPointer用法详解
      • 一、d-pointer的基本用法
      • 二、QSharedDataPointer的用法
      • 三、d-func()和const d-func()的使用
      • 四、总结

Qt中的d-pointer(d-指针)与QSharedDataPointer用法详解

在Qt框架中,d-pointer(d-指针)是一种常用的设计模式,用于隐藏类的实现细节,提高代码的可维护性和封装性。d-pointer通常与Pimpl(Pointer to IMPLementation)惯用法相结合,通过将类的实现细节封装在一个私有或受保护的类中,并在头文件中仅暴露一个指向该私有类的指针,从而减少了头文件的依赖和编译时间。

在Qt中,QSharedDataPointer是一个特殊的智能指针,用于管理实现了QSharedData接口的类的数据。这种智能指针允许数据在多个对象之间共享,同时确保数据的正确删除和内存管理。当最后一个使用数据的对象被销毁时,数据也会被自动删除。

下面,我们将详细探讨QFileInfo类(假设其内部使用了d-pointer和QSharedDataPointer)中这些技术的用法。

一、d-pointer的基本用法

在Qt中,d-pointer通常定义为一个私有或受保护的成员变量,指向一个包含类实现细节的私有类。这个私有类通常被称为“d类”或“实现类”。

// QFileInfo.h
class QFileInfoPrivate; // 前向声明私有类

class QFileInfo {
protected:
    QSharedDataPointer<QFileInfoPrivate> d_ptr; // d-pointer,使用QSharedDataPointer管理

public:
    // ... 类的公共接口 ...

private:
    // 声明d-func()和const d-func()成员函数,用于访问d-pointer
    QFileInfoPrivate* d_func();
    inline const QFileInfoPrivate* d_func() const {
        return d_ptr.constData(); // 返回d-pointer指向的const数据
    }

    // ... 类的私有接口和成员 ...
};

在上面的代码中,QFileInfo类包含一个受保护的QSharedDataPointer<QFileInfoPrivate>成员变量d_ptr。这个指针指向QFileInfoPrivate类的实例,后者包含了QFileInfo类的所有实现细节。

二、QSharedDataPointer的用法

QSharedDataPointer是Qt提供的一个模板类,用于管理实现了QSharedData接口的类的实例。当多个QFileInfo对象共享相同的QFileInfoPrivate数据时,QSharedDataPointer可以确保这些数据只被存储一次,并在所有引用它的对象被销毁时自动删除。

// QFileInfoPrivate.h
#include <QSharedData>

class QFileInfoPrivate : public QSharedData {
public:
    // ... 类的成员变量和成员函数 ...

    // 例如,可能包含文件路径、大小、权限等信息
    QString filePath;
    qint64 fileSize;
    // ... 其他成员 ...
};

QFileInfoPrivate类中,我们继承自QSharedData,这使得我们可以使用QSharedDataPointer来管理它的实例。

三、d-func()和const d-func()的使用

为了访问d-pointer指向的私有类实例,QFileInfo类提供了d_func()const d_func()成员函数。这些函数返回指向QFileInfoPrivate实例的指针或const指针,允许在类的非const成员函数和const成员函数中分别访问和修改私有数据。

// QFileInfo.cpp
#include "QFileInfo.h"
#include "QFileInfoPrivate.h"

// 实现d-func()
QFileInfoPrivate* QFileInfo::d_func() {
    return reinterpret_cast<QFileInfoPrivate*>(d_ptr.data()); // 转换为正确的类型
}

// ... 其他QFileInfo成员函数的实现 ...

// 例如,一个获取文件路径的函数
QString QFileInfo::filePath() const {
    Q_D(const QFileInfo); // 使用Q_D宏简化d-pointer的访问
    return d->filePath; // 访问私有数据
}

在上面的代码中,我们使用了Q_D宏来简化对d-pointer的访问。这个宏在Qt中定义,用于声明一个名为d的局部变量,并将其初始化为调用d_func()的结果。这样,我们就可以在函数体内使用d来访问私有数据了。

四、总结

通过使用d-pointer和QSharedDataPointer,Qt类可以在保持接口稳定的同时,灵活地修改其内部实现。这种技术减少了头文件的依赖,提高了编译速度,并允许类的私有数据在多个对象之间安全地共享。在Qt框架中,这种设计模式被广泛采用,是Qt代码库中的一个重要组成部分。


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2240738.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何绑定洛谷账号

首先注册洛谷 然后登陆 点击键盘F12 点击加号 点击应用程序 在name中找到__client_id和_uid 再复制相应的value到下图右侧 然后点击confirm即可 愿我们都能成为我们想要去成为的人&#xff01; 花会沿路盛开&#xff0c;我们以后的路也会&#xff01; 追风赶月莫停留&…

5G CPE:为什么活动会场与商铺的网络成为最新选择

在快节奏的现代社会中&#xff0c;无论是举办一场盛大的活动还是经营一家繁忙的商铺&#xff0c;稳定的网络连接都是不可或缺的基石。然而&#xff0c;面对复杂的布线难题或高昂的商业宽带费用&#xff0c;许多场所往往陷入两难境地。幸运的是&#xff0c;5G CPE&#xff08;Cu…

【ACM独立出版|高校主办】第四届信号处理与通信技术国际学术会议(SPCT 2024)

第四届信号处理与通信技术国际学术会议&#xff08;SPCT 2024&#xff09; 2024 4th International Conference on Signal Processing and Communication Technology 2024年12月27-29日 中国深圳 www.icspct.com 会议亮点&#xff1a; 1、ACM独立出版&#xff0c;EI稳…

CPU的性能指标总结(学习笔记)

CPU 性能指标 我们先来回顾下&#xff0c;描述 CPU 的性能指标都有哪些。 首先&#xff0c;最容易想到的应该是 CPU 使用率&#xff0c;这也是实际环境中最常见的一个性能指标。 用户 CPU 使用率&#xff0c;包括用户态 CPU 使用率&#xff08;user&#xff09;和低优先级用…

python 同时控制多部手机

在这个智能时代,我们的手机早已成为生活和工作中不可或缺的工具。无论是管理多个社交媒体账号,还是处理多台设备上的事务,如何更高效地控制多个手机成为了每个人的痛点。 今天带来的这个的软件为你提供了一键控制多部手机的强大功能。无论是办公、娱乐,还是社交,你都能通过…

实用教程:如何无损修改MP4视频时长

如何在UltraEdit中搜索MP4文件中的“mvhd”关键字 引言 在视频编辑和分析领域&#xff0c;有时我们需要深入到视频文件的底层结构中去。UltraEdit&#xff08;UE&#xff09;和UEStudio作为强大的文本编辑器&#xff0c;允许我们以十六进制模式打开和搜索MP4文件。本文将指导…

java项目-jenkins任务的创建和执行

参考内容: jenkins的安装部署以及全局配置 1.编译任务的general 2.源码管理 3.构建里编译打包然后copy复制jar包到运行服务器的路径 clean install -DskipTests -Pdev 中的-Pdev这个参数用于激活 Maven 项目中的特定构建配置&#xff08;Profile&#xff09; 在 pom.xml 文件…

【扩散——BFS】

题目 代码 #include <bits/stdc.h> using namespace std; const int t 2020, off 2020; #define x first #define y second typedef pair<int, int> PII; int dx[] {0, 0, 1, -1}, dy[] {-1, 1, 0, 0}; int dist[6080][6080]; // 0映射到2020&#xff0c;2020…

C++编程:利用环形缓冲区优化 TCP 发送流程,避免 Short Write 问题

文章目录 1. 什么是 Short Write 问题&#xff1f;2. 如何解决 Short Write 问题&#xff1f;2.1 方法 1&#xff1a;将 Socket 设置为阻塞模式2.2 方法 2&#xff1a;用户态维护发送缓冲区 3. 用户态维护发送缓冲区实现3.1 核心要点3.2 代码实现3.3 测试程序 参考文档 1. 什么…

数据网格能替代数据仓库吗?

一、数据网格是什么&#xff1f; 数据网格&#xff1a;是一种新兴的数据管理架构和理念&#xff0c;主要用于解决大规模、复杂数据环境下的数据管理和利用问题。 核心概念&#xff1a; 1、数据即产品&#xff1a;将数据看作一种产品&#xff0c;每个数据域都要对其生产的数据负…

力扣经典面试26题删除有序数组中的重复项1

给你一个非严格递增排列的数组nums&#xff0c;请你原地删除重复出现的元素&#xff0c; 使每个元素 只出现一次&#xff0c;返回删除后数组的新长度。元素的相对顺序 应该保持 一致。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k&#xff0c; 你需要做以…

LLM: AI Mathematical Olympiad (上)

文章目录 一、项目简介二、first place 攻略三、必备知识1、COT思维链技术2、ToRA 四、first place 训练功略五、数据集构建1、COT数据集2、TIR数据集 六、数据集详细技术报告总结 本文较长分成两个部分分析 | ू•ૅω•́)ᵎᵎᵎ 第一部分&#xff1a;预备知识介绍和数据准备…

GA/T1400视图库平台EasyCVR视频融合平台HLS视频协议是什么?

在数字化时代&#xff0c;视频监控系统已成为保障安全、提升效率的关键技术。EasyCVR视频融合云平台&#xff0c;作为TSINGSEE青犀视频在“云边端”架构体系中的重要一环&#xff0c;专为大中型项目设计&#xff0c;提供了一个跨区域、网络化的视频监控综合管理系统平台。它不仅…

给阿里云OSS绑定域名并启用SSL

为什么要这么做&#xff1f; 问题描述&#xff1a; 当用户通过 OSS 域名访问文件时&#xff0c;OSS 会在响应头中增加 Content-Disposition: attachment 和 x-oss-force-download: true&#xff0c;导致文件被强制下载而不是预览。这个问题特别影响在 2022/10/09 之后新开通 OS…

`node-gyp` 无法找到版本为 `10.0.19041.0` 的 Windows SDK

从你提供的错误信息来看&#xff0c;问题出在 node-gyp 无法找到版本为 10.0.19041.0 的 Windows SDK。我们可以尝试以下几种方法来解决这个问题&#xff1a; 完整示例 方法 1&#xff1a;安装指定版本的 Windows SDK 下载并安装 Windows SDK&#xff1a; 访问 Windows SDK 下…

【Hive】【HiveQL】【大数据技术基础】 实验四 HBase shell命令实验

实验四&#xff1a;熟悉常用的HBase操作 实验概览 在本次实验中&#xff0c;我们将深入探索HBase在Hadoop生态系统中的角色&#xff0c;并熟练掌握常用的HBase Shell命令和Java API操作。通过这些实践&#xff0c;我们能够更好地理解HBase的工作原理以及如何在实际项目中应用。…

3D意识(3D Awareness)浅析

一、简介 3D意识&#xff08;3D Awareness&#xff09;主要是指视觉基础模型&#xff08;visual foundation models&#xff09;对于3D结构的意识或感知能力&#xff0c;即这些模型在处理2D图像时是否能够理解和表示出图像中物体或场景的3D结构&#xff0c;其具体体现在编码场景…

快递面单批量导入打印软件小程序下载 佳易王网店快递面单批量打印管理系统操作教程

一、概述 【软件文件资源在文章最后】 快递面单批量导入打印软件小程序下载 快递面单批量打印管理系统操作教程 直接使用快递空白单打印&#xff0c;可以扫描条码并可以查询快递信息&#xff0c;面单内容可以自定义。 可以批量导入批量打印&#xff0c;从而提高效率节省时间…

缓冲区溢出,数据被踩的案例学习

继续在ubuntu上学习GDB&#xff0c;今天要学习的是缓冲区溢出。 程序的地址&#xff1a; GitHub - gedulab/gebypass: bypass password by heap buffer overflow 编译的方法&#xff1a; gcc -g -O2 -o gebypass gebypass.c 照例设置一下科学shangwang代理&#xff1a; e…

数据库SQL——连接表达式(JOIN)图解

目录 一、基本概念 二、常见类型 内连接&#xff08;INNER JOIN&#xff09;&#xff1a; 左连接&#xff08;LEFT JOIN 或 LEFT OUTER JOIN&#xff09;&#xff1a; 右连接&#xff08;RIGHT JOIN 或 RIGHT OUTER JOIN&#xff09;&#xff1a; 全连接&#xff08;FULL…