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

QT的d指针和p指针

在 Qt 中,d 指针和 p 指针是 PIMPL(Pointer to Implementation)设计模式的具体实现。它们用于将类的实现细节隐藏在一个单独的类中,从而提高封装性、减少编译依赖,并改善二进制兼容性。


1. d 指针(d-pointer)

d 指针是 Qt 中用于指向私有实现类(Private Implementation Class)的指针。它的命名约定是 d_ptr

作用

  • 将类的实现细节隐藏在私有类中。

  • 公有类只暴露接口,不包含任何私有成员或方法的实现。

  • 减少头文件的依赖,加快编译速度。

实现方式

  1. 在公有类中定义一个指向私有类的指针(通常是 QScopedPointer 或 std::unique_ptr)。

  2. 私有类的名称通常是 ClassNamePrivate

示例

// myclass.h
#include <QObject>

class MyClassPrivate; // 前向声明私有类

class MyClass : public QObject {
    Q_OBJECT
public:
    MyClass(QObject *parent = nullptr);
    ~MyClass();

    void publicMethod();

private:
    Q_DECLARE_PRIVATE(MyClass) // 声明 d 指针
    QScopedPointer<MyClassPrivate> d_ptr; // 定义 d 指针
};

// myclass.cpp
#include "myclass.h"

// 私有类的定义
class MyClassPrivate {
public:
    void privateMethod() {
        // 私有方法的实现
    }

    int privateData = 42; // 私有成员变量
};

// 公有类的构造函数
MyClass::MyClass(QObject *parent)
    : QObject(parent), d_ptr(new MyClassPrivate) {}

// 公有类的析构函数
MyClass::~MyClass() {}

// 公有方法的实现
void MyClass::publicMethod() {
    Q_D(MyClass); // 展开为 MyClassPrivate *d = d_func();
    d->privateMethod(); // 访问私有方法
    int value = d->privateData; // 访问私有成员
}

2. p 指针(p-pointer)

p 指针是 Qt 中用于指向父类(Parent Class)的指针。它的命名约定是 q_ptr

作用

  • 在私有类中访问公有类的成员。

  • 通常与 d 指针配合使用,形成双向访问。

实现方式

  1. 在私有类中定义一个指向公有类的指针(通常是 QPointer 或裸指针)。

  2. 在公有类的构造函数中,将 this 指针传递给私有类。

示例

// myclass.h
#include <QObject>

class MyClassPrivate; // 前向声明私有类

class MyClass : public QObject {
    Q_OBJECT
public:
    MyClass(QObject *parent = nullptr);
    ~MyClass();

    void publicMethod();

private:
    Q_DECLARE_PRIVATE(MyClass) // 声明 d 指针
    QScopedPointer<MyClassPrivate> d_ptr; // 定义 d 指针
};

// myclass.cpp
#include "myclass.h"

// 私有类的定义
class MyClassPrivate {
public:
    MyClassPrivate(MyClass *parent)
        : q_ptr(parent) {}

    void privateMethod() {
        // 访问公有类的成员
        Q_Q(MyClass); // 展开为 MyClass *q = q_func();
        q->publicMethod();
    }

    int privateData = 42; // 私有成员变量

private:
    MyClass *const q_ptr; // 定义 p 指针
    Q_DECLARE_PUBLIC(MyClass) // 声明 p 指针
};

// 公有类的构造函数
MyClass::MyClass(QObject *parent)
    : QObject(parent), d_ptr(new MyClassPrivate(this)) {}

// 公有类的析构函数
MyClass::~MyClass() {}

// 公有方法的实现
void MyClass::publicMethod() {
    Q_D(MyClass); // 展开为 MyClassPrivate *d = d_func();
    d->privateMethod(); // 访问私有方法
    int value = d->privateData; // 访问私有成员
}

3. Q_D 和 Q_Q 宏

为了简化 d 指针和 p 指针的使用,Qt 提供了以下宏:

  • Q_D(Class):在公有类中获取 d 指针。

    Q_D(MyClass); // 展开为 MyClassPrivate *d = d_func();

  • Q_Q(Class):在私有类中获取 p 指针。

    Q_Q(MyClass); // 展开为 MyClass *q = q_func();


4. 总结

  • d 指针:指向私有实现类的指针,用于隐藏实现细节。

  • p 指针:指向公有类的指针,用于在私有类中访问公有类的成员。

  • Q_DECLARE_PRIVATE 和 Q_DECLARE_PUBLIC:用于声明 d 指针和 p 指针。

  • Q_D 和 Q_Q 宏:用于简化 d 指针和 p 指针的访问。

通过使用 d 指针和 p 指针,Qt 实现了良好的封装性和二进制兼容性,同时减少了编译依赖。


http://www.kler.cn/a/513260.html

相关文章:

  • 简述mysql 主从复制原理及其工作过程,配置一主两从并验证
  • Swift语言的函数实现
  • Qt按钮美化教程
  • Python绘制数据地图-MovingPandas
  • 鸿蒙开发中的骨架图:提升用户体验的关键一环
  • MySQL表的增删改查(基础)CRUD
  • 2025/1/21 学习Vue的第四天
  • VR vs AR:哪种技术更有潜力改变未来?
  • TREE用于识别癌症基因
  • 以Python构建ONE FACE管理界面:从基础至进阶的实战探索
  • Level2逐笔成交逐笔委托毫秒记录:今日分享优质股票数据20250121
  • 1月21日星期二今日早报简报微语报早读
  • HTML 属性大全:全面解析所有 HTML 属性
  • 【大数据】机器学习----------强化学习机器学习阶段尾声
  • SQL 递归 ---- WITH RECURSIVE 的用法
  • 基于微信小程序的科创微应用平台设计与实现(LW+源码+讲解)
  • 基于低代码平台的敏捷IT方案
  • dsu模板
  • java微服务中消息队列处理中间件基础语法学习,零基础学习
  • Android RTMP直播练习实践
  • C语言基本知识
  • Java 的初认识(一)
  • SpringCloud Eureka-账号密码配置
  • 线下陪玩系统架构与功能分析
  • vue2:为el-form-item的label设置背景色
  • 【SpringBoot深入浅出系列】SpringBoot之Actuator,让应用监控与管理变得简单高效