一. 避免进行重编译:(Cheshire Cat)
如果我们可以很好的隐藏类的实现那么对于实现的改动将不会导致已有代码的崩溃,不过它通常都会要求我们重新编译这些代码。
如:对内联函数定义的改动,对于对象大小的改动,以及对于使用内联函数访问的对象结构的改动都将导致程序的重新编译。我们
可以使用句柄来避免这些重编译:如果我们改动了rep 的实现,用户要做的只是重新连接(而不是编译)一下他们的程序。
下面是一个新版本的String类,在其中我们没有使用计数器,而是使用了句柄来减少编译时期的依赖关系:
//文件 String.h
class String_rep;
class String
{
private:
String_rep* rep;
public:
String(const char* = "");
String(const String& );
~String();
const String& operator=(const String& );
};
另外一个头文件是一个私有的头文件,我们不需要将它分发给用户。它里面包含了rep 类的完整声明:
//文件 String_priv.h
#include "String.h"
class String_rep
{
private:
friend class String;
int use_count;
char* chars;
String_rep(const char* );
String_rep(const String_rep& );
~String_rep();
void increment();
void decrement();
const String_rep* operator=(const String_rep& );
};
用该私有头文件来编译String和String_rep的成员:
#include "String_priv.h"
String::String(const char* cp)
:rep(new String_rep(cp))
{
rep->increment();
}