纠正《Effective C++(第三版)》侯捷译 中文版中,第31条款中原文“最后,不论Handle classes或Interface classes,一旦脱离inline函数都无法...”的误译

感谢slimzhao的博文消除了我的迷惑,博文原文地址为

http://blog.chinaunix.net/uid-53564-id-3259704.html


我在读Effective C++ 中文版的第31条,倒数第二段的原文——“最后,不论Handle classes或Interface classes,一旦脱离inline函数都无法有太大作为。”——始终无法理解,为什么Handle Class 和 Interface classes必须要依赖inline函数。

Handle Class的原型类似

//声明实现细节
class ImplementClass;
//定义类本体
class HandleClass{
public:
   int Interface(void);
private:
   ImplementClass* pImpl;
}
其中,ImplementClass 被定义在其他的头文件中,而那个文件是不会提供给HandleClass类的用户的。

所以说,Handle class 的最大意义在于:完全将接口与实现细节分离,达到封装的目的。

所以基于此,当ImplementClass类,也就是实现细节被修改时,当然不会重新编译整个工程,因为实现细节已经被良好封装了。


另一方面,Interface class的原型类似

//定义抽象基类作为接口类
class BaseClass{
public:
   virtual ~BaseClass();
   virtual int Interface1(void) = 0;
   virtual int Interface2(int,float) = 0;
   virtual double Interface3(double) = 0;
   ...
}

// 定义具体类如下
class DeriveClass{
public:
   DeriveClass(){...}
   virtual ~DeriveClass(){...}
   virtual int Interface1(){...}
   virtual int Interface2(int ivar, float fvar){...}
   virtual double Interface3(double dvar){...}
private:
   ...//一些成员变量
}
用户使用BaseClass提供的接口设计函数,这种设计的函数可以根据具体传入的派生类类型,调用正确的派生类版本的实现代码。例如,传入的是DeriveClass类的实例的指针,则会自动调用DeriveClass版本的接口实现代码。

这种设计模式是典型的“工厂模式”,

Interface class的最大优点在于可以使用“基类接口操作派生类对象。

所以,由于用户代码中只有基类的接口,当某个派生类的实现代码发生改变时,也不用重新编译所有用户代码。


相比较于Implement class 和Interface class ,inline 函数的优点暂且不提,其可造成的最大问题就是一旦inline函数发生变化,则所有调用inline 函数的代码都必须重新编译

所以无论是Implement class 中的实现细节类中的函数,还是 interface class中的接口函数,一旦本身是inline 函数,或调用了inline函数,则一旦inline 函数发生改变,则所有引用到这些函数的代码都会发生改变,就是说要重新编译,而这样一来,Implement class 和 Interface class 所做的所有努力不都是白费了么?毕竟都是为了让实现代码与用户代码完全分离。

所以我查了下Effective c++ 的原文

Finally, neither Handle classes nor Interface classes can get much use out of inline functions.

由于使用了neither... nor... 的句型,所以正确翻译是:

最后,无论是Handle classes 还是 Interface classes,一旦使用了inline 函数,都不会有太大作为。



评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值