手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

C 实现委托和消息反馈模板

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
 摘要:本文简单介绍并比较了用于实现消息反馈的几种常见技术,其中周详介绍了利用C 模板技术来实现类型安全的委托的要点和限制,能够作为理解qt/gtk 等UI库的信号反馈机制的入门文章。

  正文:我写过不少C 程式,写过库也写过客户程式。一般库都会提供一些好用的类供客户程式使用,不少库还能够让客户程式响应库内的某些事件。比如MFC/ATL/VCL提供消息响应,很多ActiveX提供自定义消息响应,甚至是系统底层的中断调用都能够列入这个范畴。然而,正是以上这些“反向”的调用让我觉得很烦恼。

  继承 多态

  乍一看是理所当然的选择,库中的类把响应处理函数配置为虚函数,客户程式能够继承这个类并且重载响应函数。以某个Socket类为例,能够提供一个OnRecv函数用来响应网络数据包到达的处理。客户程式只需要重载OnRecv并进行自己的处理就能够了。

struct Socket { // base class
virtual void OnRecv();
};
stuct MySocket { // your event-handle class
virtual void OnRecv() { /* do sth here ... */ }
}

  疑问:很多时候这样做实在很烦,特别是做小程式的时候,或需要快速做原型的时候,一眼望去小小的程式一上来就继承了一大堆东西,颇为不爽。只是想着能省事一点,希望能像那些脚本语言相同快速绑定消息响应,而不是以继承开始工作——我已害怕看到长长的类继承树了,很多时候根本不必要继承整个类;又或某些类只提供一个接口而不是具体的类又或需要多重继承,处理都有一定麻烦;最麻烦的莫过于有时候需要改变响应处理,难道继承好几个下来么——这么多虚表也是浪费啊。

  点评:为了使用Socket就必须继承Socket,这能够说是Socket的设计的问题。假如需要实现类似的功能的话,能够写成如下,虽然和继承 Socket 没有多少本质的差别,但是确实把消息处理类和Socket的实现扯开了。:

struct SocketEventHandler {
virtual void OnRecv() { /* ... */ }
virtual void OnSend() { /* ... */ }
};
struct Socket {
void set_handler( SocketEventHandler* h ) { handler_ = h; }
private:
SocketEventHandler* handler_;
};
struct MyHandler : SocketEventHandler {
void OnRecv() { ... }
};
Socket s;
MyHandler h;
s.set_handler( &h );

  突然之间,我感到一阵迷茫,很渴望一种简单明确的表达方法。丢开继承,我们更有什么把戏?我不禁想起了c时代的回调函数……

  回调函数(CallBack)

  很简单,就是个函数指针。刚才的OnRecv能够写成这样

struct Socket {
void OnRecv() { if(OnRecvHandle!=NULL) OnRecvHandle(); }
void (*OnRecvHandle) ();
};

  客户程式只需要编写一个MyOnRecv函数,并且赋值给OnRecvHandle就能够了

void MyOnRecv(); // your event-handle function
Socket foo;
foo.OnRecvHandle = MyOnRecv;


  疑问:很简单,无需继承类就能够处理,而且随时能够替换不同的处理函数。其实多态的本质也是函数指针,只但是多态是用vtable统一管理函数指针。回调函数要特别注意函数指针是否为空的问题,因此最好外面在包装一层判断过程。回调函数最大问题在于类型不安全,显式指针这东西……不说也罢……翻了一下智能指针和模版,我发现了一根稻草……



[1] [2] [3] 下一页

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS