【发布时间】:2015-09-12 22:49:10
【问题描述】:
当我阅读item31的问题陈述:Effective C++的最小化文件之间的编译依赖时,下面的陈述让我感到困惑:
class Person {
public:
Person(const std::string& name, const Date& birthday,
const Address& addr);
std::string name() const;
std::string birthDate() const;
std::string address() const;
...
private:
std::string theName; // implementation detail
Date theBirthDate; // implementation detail
Address theAddress; // implementation detail
};
在定义 Person 类的文件中,您可能会找到如下内容:
#include
#include "date.h"
#include "address.h"
不幸的是,这在定义 Person 的文件和这些头文件之间建立了编译依赖关系。如果这些头文件中的任何一个(我的评论:上面列出的头文件,即
、“date.h”、“address.h”)被更改,或者如果它们依赖的任何头文件发生更改,则包含的文件必须重新编译 Person 类,任何使用 Person 的文件也必须重新编译。
我不太明白的是最后突出显示的部分。为什么使用 Person 的客户端需要重新编译?他们只需要重新链接到新编译的 Person 对象代码,对吧(我假设 Person 接口对其客户端保持不变)?
如果客户真正需要的——假设 Person 界面没有改变——只是重新链接,它是否仍然保证 Pimpl 习惯用法?如果任何标头发生更改,Pimpl 类仍需要重新编译。该成语只为客户端节省了一次重新链接。
编辑:似乎对于哪些标题发生了变化有很多困惑。在这种情况下,Scott Meyers 谈到了 Person.h 包含的头文件已更改。但是 Person.h 本身并没有改变,因此使用(#include)Person.h 的客户端看不到任何变化(Person.h 上没有时间戳变化)。 makefile 依赖项将 Person.o 列为先决条件,因此客户端将简单地与新的 Person.o 链接。我正在学习 Pimpl 成语,也许我错过了每个人的论点中的一些明显要点。请说明。
EDIT2:当客户端需要使用Person时,它包含Person.h,其中还包含了所有其他包含的文件,例如date.h和address.h。我错过了这部分,并认为只有 Person.cpp 需要处理这些标头。
【问题讨论】:
-
您不断重复“标题更改”。我已经多次要求您在您选择的场景中定义它们如何发生变化,但您尚未提供关键细节。
标签: c++