【C++】浅谈C++句柄类

【C++】浅谈C++句柄类一 句柄类思想 nbsp nbsp Thinkinginc 第一卷的中文翻译实在是无法忍 偏偏我就有这么一本 还是合订本的 nbsp nbsp 幸好读到了一个从前没意识到的问题 也算是值了 句柄类 也叫 CheshireCat nbsp nbsp nbsp 问题背景是这样的 1 在极为安全的领域 即使核心实现已经封闭在库中不可见 但是头文件中的变量定义仍然可能会曝露一些内部信息 2 在设计初期 实现部分固然需要经常

一、句柄类思想

   Thinking in c++ 第一卷的中文翻译实在是无法忍,偏偏我就有这么一本(还是合订本的)。

   幸好读到了一个从前没意识到的问题,也算是值了:句柄类,也叫Cheshire Cat。

   问题背景是这样的:1)在极为安全的领域,即使核心实现已经封闭在库中不可见,但是头文件中的变量定义仍然可能会曝露一些内部信息; 2)在设计初期,实现部分固然需要经常变动,连头文件中变量定义也需要经常变动,因此在重编译的时候头文件也需要编译,有时候导致编译时间过长。句柄类可以解决这类问题:

//:HANDLE.H -- Handle Classes #ifndef HANDLE_H_ #define HANDLE_H_ class handle { struct cheshire; // Class declaration only cheshire* smile; public: handle( ); void doit( ); ~handle( ); }; #endif // HANDLE_H_

   这是所有客户程序员都能看到的,其中struct cheshire是没有完全指定的类型说明或类说明,将用来存放真正的变量。在这种技术中,包含具体实现的结构主体被隐藏在实现文件中。
 

//:HANDLE.CPP -- Handle implementation #include "handle.h" //Define handle's implementation struct handle:cheshire { int i; }; handle::handle() { smile=(cheshire*)malloc(sizeof(cheshire)); smile->i=0; } void handle::doit() { //do something with i } handle::~handle() { free(smile); }

句柄类的使用就像任何类的使用一样,包括头文件,创建对象,发送信息。但是通过这样的设计,即隐藏了变量的设计,也使得实现作变动时无需重编译头文件。Bruce说虽然这并不是完美的信息隐蔽,但毕竟是一大进步。

二:什么时候用到句柄类:

)在对安全要求很高的领域,即使核心实现已经封闭在库中不可见,但头文件中变量定义仍可能曝露一些内部信息 


)在设计初期,实现部分会经常变动,甚至头文件中变量定义也需要经常变动,因此在重编译的时候头文件也需要编译,有时候导致编译时间过长。 


)项目做大了就会发现,往往一个工程文件代码改一个部分就需要很长时间的编译,那个等待是非常痛苦啊,所以开始在工程的架构上一定要做好充分的准备!

三:看下面的小例子来理解上面 3 条理论:

//-------handle.h-------- #ifndef HANDLE_H #define HANDLE_H class Handle {  class Test;  Test *t; public:  void init();  void show(); }; #endif //--------handle.cpp---------- #include "handle.h" class Handle::Test {   public:   int i; }; void Handle::init() { t=new Test; t->i=0; } void Handle::show() { cout< 
   
     i< 
    
      //---------main.cpp--------- 
     #include "handle.h" 
     int main() { Handle h; h.init(); h.show(); } 
     
   

写完了。首先如果修改了实现的话只需要编译 
handle.cpp 就可以,其次在 
handle.h 中看不到类 
Test 的相关内容,也就达到了封装类实现的目的。

四、桥接模式

    其实大家有木有发 现,可以把句柄类看作设计模式中的Bridge模式。

    GOF定义桥接模式: 将抽象部分与实现部分分离,使它们都可以独立的变化。

    具体桥接模式就不说了。

简单就写这么多,深入的话大家继续研究,呵呵。 


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202180.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午7:42
下一篇 2026年3月20日 上午7:43


相关推荐

  • 高中信息技术python知识点_高中信息技术《Python语言》模块试卷

    高中信息技术python知识点_高中信息技术《Python语言》模块试卷高中信息技术 Python 语言 模块试卷 由会员分享 可在线阅读 更多相关 高中信息技术 Python 语言 模块试卷 3 页珍藏版 请在人人文库网上搜索 1 区县 姓名 座号 密 封 线 高中信息技术 Python 语言模块试卷本试卷分为五大题 37 小题 共 100 分 考试用时 60 分钟 一 单选题 本题共 15 小题 每小题 2

    2026年3月17日
    2
  • decodeURI与decodeURIComponent区别

    decodeURI与decodeURIComponent区别1.概念:URI:UniformResourceIdentifiers,通用资源标识符Global对象的encodeURI()和encodeURIComponent()方法可以对URI进行编

    2022年8月1日
    8
  • SQL Server——数据库创建及修改[通俗易懂]

    SQL Server——数据库创建及修改[通俗易懂]文章目录一、SQL Server数据库的相关概念1、逻辑数据库2、物理数据库二、SQL Server数据库的基本操作1、使用SQL Server Management Studio (创建/修改/删除)数据库2、使用SQL语句(创建/修改/删除)数据库【数据库文件的类型】【主要】【次要】【事务日志】文件组1.主文件组(PRIMARY)2.用户定义文件组【文件组特性】一、SQL Server数据库…

    2022年8月18日
    9
  • CRM客户关系管理系统(十二)

    CRM客户关系管理系统(十二)

    2021年5月27日
    105
  • sql语句删除表数据drop、truncate和delete的用法[通俗易懂]

    sql语句删除表数据drop、truncate和delete的用法[通俗易懂]虽然西西不建议大家去用命令删除数据库表中的东西,但是这些删除命令总有用的着的地方。说到删除表数据的关键字,大家记得最多的可能就是delete了然而我们做数据库开发,读取数据库数据.对另外的两兄弟用得就比较少了现在来介绍另外两个兄弟,都是删除表数据的,其实也是很容易理解的老大——drop出没场合:droptable tb –tb表示数据表的名字,下同绝招:删除内

    2022年5月16日
    73
  • js绝对值(负值转正)

    js绝对值(负值转正)js 取负数的绝对值 初中代数的取绝对值运算 语法 1000 1000 js 代码如下 vart 1000 Math abs t 结果为 1000 以上就是关于 js 绝对值 负值转正 的全部内容

    2026年3月19日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号