effective c++ 22将文件间的编译依存关系降至最低<上>

假设你对 C++ 程序的某个 class 实现文件做了些轻微改变,修改的不是接口,而是实现,而且只改 private 成分。

然后重新建置这个程序,并预计只花数秒就好,当按下 “Build” 或键入 make,会大吃一惊,因为你意识到整个世界都被重新编译和链接了!

问题是在 C++ 并没有把 “将接口从实现中分离” 做得很好。class 的定义式不只详细叙述了 class 接口,还包括十足的实现细目:

class PersonEx{ 
public: 
    PersonEx(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;        //实现细目 
    Date theBirthDate;          //实现细目 
    Address theAddress;         //实现细目 
};

这个 class Person 无法通过编译,Person 定义文件的最上方可能存在这样的东西:

#include <string> 
#include "date.h" 
#include "address.h"

这样一来,便在 Person 定义文件和其含入文件之间形成了一种编译依存关系(compilation dependency)。如果这些头文件中有任何一个被改变,或这些文件所依赖的其他头文件有任何改变,那么每个含入 Person class 的文件就得重新编译,任何使用 Person class 的文件也必须重新编译。这样的的连串编译依存关系(cascading compilation dependencies)会对许多项目造成难以形容的灾难。

下面给出一种方法:

如果能够,尽量以 class 声明式替换 class 定义式。

当你声明一个函数而它用到某个 class 时,你并不需要该 class 的定义式,纵使函数以 by value 方式传递该类型的参数(或返回值)亦然。

下面是PersonEx;
在这里插入图片描述
实现:
在这里插入图片描述

PersonExImpl:
在这里插入图片描述
实现;
在这里插入图片描述

Date:
在这里插入图片描述
实现:
在这里插入图片描述
Address:
在这里插入图片描述
实现:
在这里插入图片描述

Main:
在这里插入图片描述
将Person的构造函数多加一行空格:
添加之前:
在这里插入图片描述
添加之后:
在这里插入图片描述
在这里插入图片描述
从结果可以看出,之编译了person.cpp

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发如雪-ty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值