解决问题
写C++的同学可能遇到过有时候更改了一个头文件,结果编译时间变得巨长的情况。
这是由于这个头文件可能被很多地方直接或间接地包含了,形成了依赖关系。一旦这个头文件被修改,那么依赖它的所有其他obj文件都需要被重新编译链接。
解决思路之一是我们可以尽量避免修改到头文件。
换句话说,尽量少往头文件里面丢东西,这样一来修改到头文件的概率就少了。
pimpl模式
pimpl的核心思想就是把private变量和函数都抽离头文件。
那么如何抽离呢?做这么几步:
- 头文件的公开类中 声明 一个内置类,并持有一个指向该内置类实例的 指针 (由于只是声明,所以并不能使用类的内容,但是可以用指针引用)
- 这个内置类的定义放在实现文件里
- 公开类只提供一些public接口,实际上的函数实现全部放在所定义的内置类中
这就是pimpl模式。
Show Me The Code.
1 | // Person.h |
由于Person::PersonImpl
是private且定义在实现文件中的,所以对于include了Person.h
的人来说是不可见的。
想象一下如果有一天我们突然不想在ToString()
里调用ToStringPre()
,我们可以直接把ToStringPre()
的声明和定义全都去掉,斩草除根。由于Person::PersonImpl
没有暴露在头文件中,所以#include "Person.h"
的文件不需要重新编译。
大快人心。