QT中的D指针和Q指针

ops/2024/10/21 8:30:21/
前提:之前在工作当中遇到一个崩溃问题,由于是一套很老的代码配合新的库,所以导致了引用的库和头文件产生了不匹配的问题,最后还是公司的大佬通过阅读汇编定位到的问题,之前也了解过Qt是如何规避这类问题的,所以写一篇关于D指针和Q指针的文章。

自己的一些理解:首先将对外接口和具体实现进行分离,避免具体实现发生变化影响对外接口,造成二进制不兼容的问题(也就是我之前遇到的崩溃问题),通过具体实现类和对外接口类互相持有对方的指针(也就是D指针和Q指针)来实现双方的交互。所以当我们阅读Qt源码的时候,可以通过对外接口类了解该类对外支持的功能(对外接口),但是具体的实现要看实现类中是如何实现功能的。

下面是一些定义和解析:

一、D指针和Q指针的基本概念

D指针和Q指针实际上是类的成员指针变量,分别指向一个私有类(通常称为Private类)对象和一个公有类对象。这种设计模式的核心是将类的实现细节与接口分离,从而减少编译依赖,提高代码的灵活性和可维护性。

  1. D指针(d_ptr)
    • 定义在公有类中,指向一个私有类对象。
    • 私有类对象包含类的所有实现细节和成员变量。
    • 通过宏Q_DECLARE_PRIVATEQ_D在主类中访问私有类对象。
  2. Q指针(q_ptr)
    • 定义在私有类中,指向一个公有类对象。
    • 允许私有类访问公有类的公有接口和成员变量。
    • 通过宏Q_DECLARE_PUBLICQ_Q在私有类中访问公有类对象。
二、D指针和Q指针解决的问题
  1. 数据隐藏
    • 通过将实现细节封装在私有类中,D指针使得公有类的头文件更加简洁,只暴露必要的接口。
    • 这有助于隐藏类的内部实现,减少不必要的依赖。
  2. 二进制兼容性
    • 当私有类的实现发生变化时,由于公有类的接口保持不变,因此不需要重新编译依赖该公有类的程序。
    • 这对于库的维护者来说是一个巨大的优势,因为它允许在不破坏现有代码的情况下进行改进和扩展。
  3. 减少编译依赖
    • 由于实现细节被封装在私有类中,因此公有类的头文件不需要包含私有类的头文件。
    • 这减少了编译时的依赖关系,提高了编译速度。
三、D指针和Q指针的优缺点

优点

  • 提高代码的可维护性:通过分离接口和实现,使得代码更加清晰和易于维护。
  • 增强二进制兼容性:允许在不重新编译依赖程序的情况下修改私有类的实现。
  • 减少编译时间:通过减少头文件之间的依赖关系,提高了编译速度。

缺点

  • 增加内存开销:每个公有类对象都需要一个额外的指针来指向私有类对象。
  • 复杂性增加:对于初学者来说,理解D指针和Q指针的使用可能需要一些时间。

http://www.ppmy.cn/ops/127221.html

相关文章

RabbitMQ系列学习笔记(九)--路由模式

文章目录 一、路由模式原理二、多重绑定三、路由模式实战1、消费者代码2、生产者代码3、运行结果分析 本文参考 尚硅谷RabbitMQ教程丨快速掌握MQ消息中间件rabbitmq RabbitMQ 详解 Centos7环境安装Erlang、RabbitMQ详细过程(配图) 一、路由模式原理 使用发布订阅模式时&#x…

cefsharp63.0.3(Chromium 63.0.3239.132)支持H264视频播放-PDF预览 老版本回顾系列体验

一、版本 版本:Cef 63/CefSharp63.0.3/Chromium63.0.3239.132/支持H264/支持PDF预览 支持PDF预览和H264推荐版本 63/79/84/88/100/111/125 <

C语言(函数)—函数栈帧的创建和销毁

目录 前言 补充知识 一、函数线帧是什么&#xff1f; 二、函数线帧的实现&#xff08;举例说明&#xff09; 两数之和代码 ​编辑两数之和 汇编代码分析 执行第一条语句 执行第二条语句 执行第三条语句 执行第四、五、六条语句 执行第七条语句 执行第八、九、十条语句 执行第十…

网络服务--时间服务器

NTP 是网络时间协议&#xff08;Network Time Protocol&#xff09;的简称&#xff0c;通过 udp 123 端口进行网络时钟同步。 #查看当前主机监听的端口信息 ss -lntup netstat -lntup [rootClient red1]# ss -lntup Netid State Recv-Q Send-Q Local Address:Po…

【设计模式】深入理解Python中的过滤器模式(Filter Pattern)

深入理解Python中的过滤器模式&#xff08;Filter Pattern&#xff09; 在软件设计中&#xff0c;面对复杂的数据处理需求时&#xff0c;我们常常需要从一组数据中筛选出符合特定条件的子集。**过滤器模式&#xff08;Filter Pattern&#xff09;**是一种能够简化这种操作的设…

HarmonyNext保存Base64文件到Download下

本文介绍如何保存Base64的文件到Download下 参考文档地址&#xff1a; 保存用户文件-Harmony Next 用到的是DOWNLOAD模式保存文件 用户在使用save接口时&#xff0c;可以将pickerMode配置为DOWNLOAD模式&#xff0c;该模式下会拉起授权接口&#xff0c;用户确认后会在公共路径…

Lua 数据类型

软考鸭微信小程序 过软考,来软考鸭! 提供软考免费软考讲解视频、题库、软考试题、软考模考、软考查分、软考咨询等服务 Lua 作为一种轻量级、灵活的脚本语言&#xff0c;其简洁的语法和强大的功能使得它在多个领域都有广泛的应用。在 Lua 编程中&#xff0c;理解并掌握数据类型…

基于SpringBoot+Vue+uniapp微信小程序的社区门诊管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…