作用:

  • 信息隐藏:把类头文件中的私有数据成员和方法隐藏起来,只暴露用户需要的接口
  • 二进制兼容:如果程序从一个以前版本的库动态链接到新版本的库之后,能够继续正常运行,而不需要重新编译,那么我们就说这个库是二进制兼容的。

1. Q_D指针

在class中配合使用 Q_DECLARE_PRIVATE 和 Q_D ,方便获取d指针,d指针指向Class##Private;

2. Q_Q指针

在class##Private配合使用 Q_DECLARE_PUBLIC 和 Q_Q ,方便获取q指针,q指针指向原class本身;
Q_DECLARE_PRIVATE 和 Q_DECLARE_PUBLIC 在作用是定义d_func和q_func这两个函数, 他们是用来在Class和Class##Private中获取彼此的指针。
Q_D 和 Q_Q 宏是用过上面定义的d_func和q_func函数来获取d、q指针

3.实际运用

使用Q_D指针指向私有成员和Q_Q指针指向公开成员

开发DLL为什么要使用Q_D/Q_Q指针?
假如,我们要把下面这个类封装成DLL:

class MyClass
{public:MyClass();~MyClass();private:int myVar;
};

显然,这个私有成员myVar是我们不想给第三方看到的,而且是代码二进制兼容性的大敌。所以我们使用Q_D指针和Q_D指针,对该私有成员myVar进行私有化。

1)、使用d_ptr指针指向MyClass的私有成员

我们定义一个私有类MyClassPrivate,并配合Q_DECLARE_PRIVATE宏,以定义指针d_ptr指向该私有类。

class MyClassPrivate;
class MyClass
{public:MyClass();~MyClass();private:MyClassPrivate * const d_ptr;Q_DECLARE_PRIVATE(MyClass);
};

然后,我们把MyClass类中该隐藏的变量塞到私有类MyClassPrivate中,下面展示私有类MyClassPrivate的实现:

class MyClassPrivate
{public:MyClassPrivate(MyClass *parent);private:MyClass * const q_ptr;Q_DECLARE_PUBLIC(MyClass);int myVar;
};

2)、使用q_ptr指针指向MyClass的公有成员

从私有类MyClassPrivate的实现代码可以看到,我们在私有类中,配合Q_DECLARE_PUBLIC宏来定义q_ptr指针指向MyClass的公有成员。

以上就是Qt使用Q_D和Q_Q指针私有实现的基本方法,下面给出一个比较完整的例子:
[ myclass.h]

#ifndef MYCLASS_H
#define MYCLASS_H
#include <QtCore/QObject>
class MyClassPrivate;
class MyClass: public QObject
{Q_OBJECTpublic:MyClass(QObject *parent = 0);virtual ~MyClass();void dummyFunc();signal:void dummySignal();private:MyClassPrivate * const d_ptr = nullptr;Q_DECLARE_PRIVATE(MyClass);Q_DISABLE_COPY(MyClass);//防止指针d_ptr的二次释放
};
#endif // MYCLASS_H

[myclass.cpp]

#include "myclass.h"
class MyClassPrivate : public QObject
{public:MyClassPrivate(MyClass *parent): q_ptr(parent){}void foobar(){Q_Q(MyClass);emit q->dummySignal();}private:MyClass * const q_ptr;Q_DECLARE_PUBLIC(MyClass);
};
MyClass::MyClass(QObject *parent): QObject(parent), d_ptr(new MyClassPrivate(this))
{
}
MyClass::~MyClass()
{Q_D(MyClass);delete d;
}
void MyClass::dummyFunc()
{Q_D(MyClass);d->foobar();
}

Q_D指针和Q_Q指针相关推荐

  1. Q_D指针(d指针)和Q_Q指针(q指针)简介

    文章目录 1. Q_D指针 2. Q_Q指针 1. Q_D指针 在class中配合使用 Q_DECLARE_PRIVATE 和 Q_D ,方便获取d指针,d指针指向Class##Private: 2. ...

  2. 解读 Q_D, Q_Q 指针

    见 qglog.h文件定义: #define Q_D(Class) Class##Private * const d = d_func()     #define Q_Q(Class) Class * ...

  3. Q_D以及Q_Q指针理解

    1. d指针 QT wiki D_Pointer 作用 隐藏接口具体实现细节 提高程序编译速度 最大程度实现二进制兼容 二进制兼容动态库:动态链接到库的前一个版本的程序继续与库的新版本一起运行而不需要 ...

  4. 【Qt】通过QtCreator源码学习Qt(十二):Q_D和Q_Q指针(简称“d指针”)详解

    1.Q_D和Q_Q指针(简称"d指针")简介 参考博客: https://www.devbean.net/2016/11/qt-creator-source-study-07/ h ...

  5. Qt中的d指针和q指针

    概述 如果程序从一个以前版本的库动态链接到新版本的库之后,能够继续正常运行,而不需要重新编译,那么我们就说这个库是二进制兼容的. 如果一个程序需要重新编译来运行一个新版本的库,但是不需要对程序的源代码 ...

  6. QT中的D指针与Q指针

    了解QT中引入D指针的初衷前需要了解下二进制兼容 1. 什么是二进制兼容 二进制兼容是针对动态链接库而言的,如果你的源代码已经编译成为可执行文件了,其中你调用了一些动态库,后来你为这个动态库进行了更新 ...

  7. C++ 笔记(14)— 指针(指针声明、取地址、取值、new/delete、NULL指针、指针运算、指针数组、数组指针、指针传递给函数、从函数返回指针)

    1. 声明指针 指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址.就像其他变量或常量一样,您必须在使用指 针存储其他变量地址之前,对其进行声明. 指针变量声明的一般形式为: type * ...

  8. Go 学习笔记(13)— 指针定义、指针特点、空指针、指针数组、指向指针的指针、指针作为函数入参

    1. 复合数据类型 Go 语言基本的复合数据类型有指针.数组.切片.字典.通道.结构和接口等.格式如下: * pointerType // 指针类型, [n]elementType // 数组类型, ...

  9. c++ char数组初始化_c专题指针数组与指针的关联

    ----在今天开始写文章之前,让我不由的想起高中里面学的一篇文章中一段话语,是荀子写的<劝学>:积土成山,风雨兴焉:积水成渊,蛟龙生焉:积善成德,而神明自得,圣心备焉.故不积跬步,无以至千 ...

最新文章

  1. 走过2011---年终总结
  2. 伺服电机常用参数设置_6个步骤教你如何快速调试伺服电机
  3. linux内核杂记(18)-内核链表结构(2)
  4. C++实现堆排序(附完整源码)
  5. 很好的理解遗传算法的样例
  6. GIS人眼中的“云GIS”
  7. 微信发布诱导违规APP处理公告:这次被点名的大家都认识
  8. 疫情肆虐之下,阿里巴巴的攻与防!
  9. 物理学基石 —— 波、电磁波、微波
  10. 按键精灵q语言连接mysql_【按键精灵8】Q语言介绍
  11. 静态分析Android程序
  12. 使用计算机有关的活动,有关计算机的活动策划书
  13. JAVA代码生成器源码-基于SSM架构
  14. 在MVC项目中设置启动页
  15. CSS:设置边框和背景
  16. 459. Repeated Substring Pattern
  17. Vue3 UI库、相关工具、可视化生态分享
  18. access h3c交换机光口_h3c交换机命令,很全面
  19. Mysq练习----财务管理系统-数据库模块
  20. 必做作业2:基础入门级视频剪辑软件调研

热门文章

  1. 永久优化:微软技术面试100题第11-20题答案修正与优化
  2. eMMC(五)——总线数据流
  3. java---集合---初级学习笔记
  4. linux查看cpu占用率的方法:
  5. 红旗linux关机,红旗Linux7.0无法关机解决办法
  6. 关于 AutoCAD ActiveX 技术 (ActiveX)
  7. JS的类型转换,强制转换和隐式转换
  8. js url加密解密
  9. 一个十分有趣的笑话:
  10. 移动硬盘连上Mac不能存入文件的解决方法