句柄类

来源:互联网 发布:电脑服务网络怎么办 编辑:程序博客网 时间:2024/06/11 03:51

c++中的访问控制(public,protected,private)允许将实现与接口部分分开,但实现部分的隐藏是不完全的,比如在private和protected区域的数据成员直接暴露在外面,可以被最终客户程序员直接看到所有的数据成员;另外如果一个程序员无论何时修改了一个类,无论修改的是公共接口部分还是私有成员的声明部分,他都必须再次编译包含头文件的所有文件,这就是易碎的基类问题(fragile base-class problem)。。

解决这个问题的技术被称为句柄类(handle class)或“Cheshire cat”。原理是把要隐藏的数据成员放在一个结构中,在类的声明中只给出该结构的声明以及一个指向该结构的指针,该结构的定义与其它所有的成员函数的定义都放在实现文件中。这样,只要接口部分不改变,头文件就不需要变动,而实现部分可以按需要任意更改,完成后只需要对实现文件重新编译,然后重新连接到项目中

举例:

//在头文件中只放公共接口和一个指针#ifndef HANDLE_H#define HANDLE_Hclass handle{    struct Cheshire;    Cheshire *smile;public:    void initialize();    void cleanUp();    int read();    void change(int x);};#endif // HANDLE_H

//在实现文件中放置具体的实现#include "handle.h"struct handle::Cheshire{    int i;}; void handle::initialize(){    smile = new Cheshire;    smile->i = 0;}void handle::cleanUp(){    delete smile;}int handle::read(){    return smile->i;}void handle::change(int x){    smile->i = x;}
main函数:
#include<iostream>#include "handle.h"int main(){    handle h;    h.initialize();    std::cout<<h.read()<<std::endl;    return 0;}



注意:Cheshire是一个嵌套结构,所以它必须用作用域符(::)定义。

这样,客户程序员就只能唯一访问的就是公共的接口部分,因此如果只修改了在实现中的部分,上面文件就不必重新编译。

原创粉丝点击