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

QT中的D指针和Q指针

前提:之前在工作当中遇到一个崩溃问题,由于是一套很老的代码配合新的库,所以导致了引用的库和头文件产生了不匹配的问题,最后还是公司的大佬通过阅读汇编定位到的问题,之前也了解过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.kler.cn/news/358001.html

相关文章:

  • 驱动开发系列22 - 调试 mesa 中的 glDrawArrays 的实现
  • 芯科科技最新第三代无线开发平台全面提升人工智能和无线连接功能!
  • http大数据post与put请求
  • C++高阶:红黑树实现
  • 【Java SE 】继承 与 多态 详解
  • leetcode389:赎金信
  • 效果不错的论文介绍:Im2Flow2Act:-跨领域机器人操控技术
  • 101 - Lecture 9
  • Python 多线程学习与使用
  • 《计算机视觉》—— 基于 dlib 库的方法将两张人脸图片进行换脸
  • React Agent 自定义实现
  • 记录 Latex 中 align 环境下, 两个对齐
  • 在Ubuntu上安装Docker以及使用
  • Linux服务器前后端项目部署vue+springboot—搭建服务器上的运行环境(JDK、Redis、MySQL、Nginx)
  • 十四、行为型(观察者模式)
  • Netty无锁化设计之对象池实现
  • C语言(函数)—函数栈帧的创建和销毁
  • 机器学习与神经网络:诺贝尔物理学奖的新纪元
  • tensorRT_Pro自学记录
  • Java_EE 网络编程(TCP与UDP通信)