Qt中的Q_D宏和d指针

本文详细介绍了Qt中Q_D宏的作用,它用于方便地获取私有类指针。Q_D宏结合Q_DECLARE_PRIVATE宏,使得在Qt类中可以便捷地使用私有类。同时,文章讨论了C++的继承与私有函数限制,以及如何在子类中正确使用Q_D宏。还探讨了如何调用私有类函数,包括在编译和链接阶段可能出现的问题,以及解决方案。
摘要由CSDN通过智能技术生成
 _ZTS7QObject

一、Q_D的在文件中的提法

  Q_D的设置意在方便地获取私有类指针,文件为qglobal.h。下面的##是宏定义的连字符。假设类名是A,那么A##Private翻译过来就是APrivate。

 #define Q_D(Class) Class##Private * const d = d_func()

  d_func()函数如下实现:

 #define Q_DECLARE_PRIVATE(Class) \
     inline Class##Private* d_func() { return reinterpret_cast<Class##Private *>(qGetPtrHelper(d_ptr)); } \
     inline const Class##Private* d_func() const { return reinterpret_cast<const Class##Private *>(qGetPtrHelper(d_ptr)); } \
     friend class Class##Private;

  这里的d_func()虽然在宏里面,但是如果代入具体的类型,这里面就变成了以Class##Private的私有类指针为返回值,以func为函数名的函数。这里的qGetPtrHelper是

 template <typename T> static inline T *qGetPtrHelper(T *ptr) { return ptr; }

  这个模板函数里面里的T要套入某个具体的类。上面的那个Q_DECLARE_PRIVATE里面的就成了这个模板类的一个调用。这个模板类就是把这个类指针转换成了静态的。有了上面的这三段代码,如果想在某个类A里面声明一个私有类,直接来一个Q_D(A),再Q_DECLARE_PRIVATE(A)就可以了。

二、宏和模板的展开

  展开前一个宏和后一个宏的一部分,成了

 #define Q_D(A) APrivate *const d= d_func()
 inline APrivate* d_func() { return reinterpret_cast<APrivate *>(qGetPtrHelper((d_ptr));}

  上面这个函数qGetPtrHelper调用的输入值是QObject类里面的一个成员变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值