C++学习(一五零)qt的公有类、私有类、Q_Q、Q_D、二进制兼容

本文探讨了Qt库的二进制兼容性,解释了如何通过公有类和私有类来实现信息隐藏,并确保版本更新时的兼容性。Q_Q和Q_D宏用于公有类与私有类之间的交互,是Qt实现d-pointer设计模式的关键,以维持二进制兼容性。

1、二进制兼容

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

如果不能保证库的二进制兼容性,就意味着每次发布库的新版本时,依赖该库的所有程序都必须重新编译才能正常运行。

2、公有类、私有类

是解决信息隐藏的问题的,发布库文件时只提供公有类的头文件而不必提供私有类的头文件,从而隐藏掉一些不想公开的内容。

如果修改的内容是私有类里面的,那么重新编译库以后,对外的公有类并没有发生变化,从而达到二进制兼容的目的。

因此这样设计类的目的至少有两个:

(1)信息隐藏

(2)二进制兼容

你不应该把这样的 private class 放在你的类的同一个头文件中,因为这样做的话就没有意义了。常见做法是,定义一个 private 的头文件,例如使用 myclass_p.h 的命名方式(这也是 Qt 的命名方式)。并且记住,不要把 private 头文件放到你发布的 include 下面!因为这不是你发布的一部分,它们是私有的。

或者把私有类定义在公有类的cpp文件中。

一般是将公有类中的private成员放在私有类中。

3、Q_Q、Q_D

Q_Q是私有类访问公有类的方法。

Q_D是公有类访问私有类的方法。

 

template <typename T> inline T *qGetPtrHelper(T *ptr) { return ptr; }
template <typename Ptr> inline auto qGetPtrHelper(const Ptr &ptr) -> decltype(ptr.operator->()) { return ptr.operator->(); }

#define Q_DECLARE_PRIVATE(Class) \
    inline Class##Private* d_func() {
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值