Qt中Class与ClassPrivate双类设计的目的是什么?
这种设计就是Qt里的PIMPL模式(Private Implementation),核心目的主要有这几个:
保障二进制兼容性:这是Qt采用该设计的首要原因。Qt作为跨平台框架,需要确保旧版本编译的程序能直接适配新版本Qt库,无需重新编译。公开类(比如QFile)的头文件里只存放指向Private类的指针,所有具体实现都封装在Private类中。只要公开类的对外接口不变,就算Private内部代码大幅修改,程序的二进制接口(ABI)也不会改变,用户的可执行文件不用重新编译就能对接新库。
彻底隐藏实现细节:把平台相关逻辑、内部依赖、复杂算法都塞进Private类,公开头文件只保留用户需要调用的API。这样用户看到的类接口更简洁,也不会因误用内部细节引发问题。比如QIODevicePrivate里可能包含Windows和Linux下不同的IO处理代码,但用户只用关注QIODevice提供的open、read这些通用方法即可。
加快编译速度:公开类的头文件无需引入Private类依赖的各类头文件,用户包含QFile头时,只会加载少量核心代码,不会连带引入一堆平台相关的头文件,大幅减少了编译时间,在大型项目中效果尤为明显。
给框架开发留足修改空间:Qt开发团队可以在Private类里随意调整实现逻辑、新增内部功能,只要不改动公开类的对外接口,就不会影响任何用户代码。比如给QFile新增内部缓存机制,直接修改QFilePrivate即可,完全无需改动QFile的头文件,用户代码连重新编译都不需要。
统一框架结构:整个Qt框架都遵循这个模式,让代码风格高度一致,开发和维护效率更高,熟悉Qt的开发者也能快速理解类的结构。
内容的提问来源于stack exchange,提问作者TSG

