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

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

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「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.kler.cn/a/395285.html

相关文章:

  • C/C++语言基础--C++模板与元编程系列六,C++元编程相关库的讲解与使用
  • 项目风险管理的3大要素
  • 安全见闻1-5
  • JavaScript 观察者设计模式
  • 三维测量与建模笔记 - 特征提取与匹配 - 4.2 梯度算子、Canny边缘检测、霍夫变换直线检测
  • 编写红绿起爆线指标(附带源码下载)
  • javascript用来干嘛的?赋予网站灵魂的语言
  • axios平替!用浏览器自带的fetch处理AJAX(兼容表单/JSON/文件上传)
  • 百度世界2024|李彦宏:智能体是AI应用的最主流形态,即将迎来爆发点
  • 应用jar包使用skywalking8(Tongweb7嵌入式p11版本 by lqw)
  • uniapp 如何使用vuex store (亲测)
  • 游戏引擎学习第二天
  • 深入理解 Spring Boot 中的 Starters
  • vue3+ant design vue实现日期等选择器点击右上角叉号默认将值变为null,此时会影响查询等操作~
  • 【C++】隐含的“This指针“
  • GIT将源码推送新分支
  • 第十四章 Spring之假如让你来写AOP——雏形篇
  • 二分查找--快速地将搜索空间减半
  • 大语言模型在序列推荐中的应用
  • MinIo在Ubantu和Java中的整合
  • 某军工变压器企业:通过集团级工业IOT平台,实现数字化转型
  • yakit远程连接(引擎部署在vps上)
  • PyAEDT:Ansys Electronics Desktop API 简介
  • Apache Doris:快速入门与实践
  • word转markdown的方法(pandoc)
  • 2024 年 10 月公链行业研报:比特币引领市场,Layer 2 竞争加剧