• Qt 的d指针


            Qt 的 d 指针,也称作 pimpl(pointer to implementation)是一种常用于 C++ 库设计的技术,它用于隐藏类的私有数据和实现细节,以保持二进制兼容性并减少头文件的依赖。这种技术在 Qt 库中被广泛应用。

            d 指针的核心思想是将类的私有成员变量放到一个单独的内部类中,并在原类中保留一个指向这个内部类的指针。通过这种方式,当内部实现需要更改时,只需要更改内部类,而不必更改公有类的头文件。这有利于减少编译依赖和保持 ABI(Application Binary Interface)的稳定性。

    在 Qt 中,通常会看到这样的类定义

    1. // 前置声明
    2. class MyClassPrivate;
    3. class MyClass {
    4. public:
    5.     MyClass();
    6.     ~MyClass();
    7.     // 公共接口函数
    8. private:
    9.     Q_DECLARE_PRIVATE(MyClass)
    10.     Q_DISABLE_COPY(MyClass)
    11.     // d 指针,指向实现细节
    12.     MyClassPrivate * const d_ptr;
    13. };

            其中,`Q_DECLARE_PRIVATE(MyClass)` 宏用于声明一些辅助函数,它使得在 MyClass 的成员函数中可以更容易地访问 d_ptr 指向的私有成员。而 `Q_DISABLE_COPY(MyClass)` 宏用于禁止类的复制构造函数和赋值操作符,以避免不正确地复制 d 指针。

    对应的,MyClassPrivate 的定义通常在源文件中出现,像这样:

    1. class MyClassPrivate {
    2. public:
    3.     // 私有数据成员和实现细节
    4. };
    5. MyClass::MyClass() : d_ptr(new MyClassPrivate) {
    6.     // ...
    7. }
    8. MyClass::~MyClass() {
    9.     delete d_ptr;
    10. }

    使用 d 指针的好处包括:

    1.二进制兼容性:在不改变公共类接口的情况下,可以随时添加或修改私有数据成员。
    2. 编译器耦合减少:由于私有成员的定义被移到了源文件中,改变私有成员不会触发依赖于相应头文件的代码重新编译。
    3. 封装性:它强制实施了良好的封装原则,因为所有的私有数据都被隐藏在实现文件中。

  • 相关阅读:
    AutoSAR入门:开发工具链介绍
    win10下pycocotools安装及问题解决
    Docker 容器服务的注册、发现及Docker安全
    快速写论文
    不清楚的照片如何变清晰?教你几招变清晰的方法
    28. 找出字符串中第一个匹配项的下标
    探索JavaScript ES6+新特性
    shell中的简单的for循环
    Java web基础知识
    【牛客网面试必刷TOP101】二叉树篇(三)
  • 原文地址:https://blog.csdn.net/qq_43287763/article/details/136681012