猿问

为什么用指针完成类实现会将文件间的依存关系降低?

问题来源于,我最早看到好多代码类都用Impl用作后缀
后来看到这其实来源于中条款31:
支持编译依存最小化的一般构想是:相依于声明式,不要相依于定义式,基于此构想的两个手段是Handleclasses和Interfaceclasses.
至于Impl一般用于提供类的具体实现,用指针进行封装,看完了,理解了这种类接口和实现思路,但是不知所以然.
具体,书中问题代码如下,private下包括私有函数都是类的实现细节,依赖的头文件改变,那么此类必须重编
#include
#include"date.h"
#include"address.h"
classPerson
{
public:
Person(conststd::string&name,constDate&birthday,constAddress&addr);
std::stringname()const;
std::stringbirthDate()const;
std::stringaddress()const;
private:
std::stringtheName;
DatetheBirthDate;
AddresstheAddress;
}
作者给出了这种的实现,如下:
#include
#include
classPersonImpl;
classDate;
classaddress;
classPerson
{
public:
/////////////
private:
std::tr1::shared_ptrpImpl;
}
这样的设计之下,Person的客户端就完全与Dates,Addresses以及Person的实现细目分离了.那些classes的任何实现修改都不需要Person客户端重新编译.
不太明白,就算PersonImpl包装了address等实现细节,运行中new了一个PersonImpl对象实现.
但是编译的时候如果address等类有更改,PersonImpl不也跟着更改了么,而且Pserson和PersonImpl一般也放在一个cpp里面定义,不懂哪里节省编译了.这块有点糊涂.各位指点一二.
蝴蝶不菲
浏览 277回答 2
2回答

慕婉清6462132

这个叫PIMPLidiom,在大型C++项目里极为常见,减少编译时间只是其中一个好处。更多请见IsthepImplidiomreallyusedinpractice?就你的例子而言:针对前面那种实现,随便对Person,Date,Address进行一点点修改,所有引用person.h的文件都必须全部编译。引用的一多,编译时间大的无法想象。针对后面那种实现,之前可能对Person的修改转移到cpp中的PersonImpl中,对于Date和Address的直接头文件引用,也都改为了前置声明。你无论改变PersonImpl,Date,Address,都不会对所有引用person.h的文件造成影响(它们都不需要重新编译)。当person.h是一个非常重要、且常用的接口。那么节省的编译时间是非常巨大的。这玩意其实不局限于C++中,往大了说,是桥接模式。极为常见的设计模式。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答