没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|其它|编辑:郝浩|2009-07-10 09:53:02.000|阅读 952 次
概述:我最近在实现一个事件处理器,应用到了一种“通用成员函数指针的注册”,先声明,这个名词是我给起的,不过我觉得并不充分恰当,但也想不出什么更好的词,看完下面的介绍,也考考您,看这玩意叫个啥比较合适。
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
我最近在实现一个事件处理器,应用到了一种“通用成员函数指针的注册”,先声明,这个名词是我给起的,不过我觉得并不充分恰当,但也想不出什么更好的词,看完下面的介绍,也考考您,看这玩意叫个啥比较合适。
先说需求:这个事件处理器需要在捕获一个事件后,调用已注册的处理函数。看起来很普通,呵呵,不过,这个事件处理函数不一定是哪个类的成员函数(但肯定是成员函数),函数的形式是一定的,即拥有相同的返回类型和参数列表。而这些事件和处理函数,注册在一个全局的结构体中。
问题的提出:同一个结构体的各字段类型是固定的,所以仔细想一下,这个保存着事件和处理函数的结构体应该怎么定义呢?事件的类型是一定的,但是处理函数呢?需求中明确指出,这个处理函数很有可能是不同类中的成员函数,而成员函数指针在定义时,是需要明确类的,比如:
定义了一个指向MyClass类中的无参数、返回类型为void的成员函数指针。这样看来,我没有办法定义一个适用于任何类成员函数的指针呀?
那么,我能不能定义一个基类 HandlerBase,让所有包含事件处理函数的类都继承自HandlerBase呢?这样我可以在定义结构体时,将事件处理函数指针定义为
void (HandlerBase::*func_ptr)(void);
刚刚有这个想法时,我还禁不住一阵欣喜,但细想才发现,这也是行不通的,因为这样的话,我们必需将所有子类中用到的事件处理函数在HandlerBase中声明为虚函数,这样一来,代码就显得混乱没有章法了,所以,这个方法还是 pass 了吧。
看上去问题可能真的很复杂,那怎么办泥?仔细研究后,感觉只有用模板来解决问题了,具体怎么来设计呢?
(补充:当我写完下面一段话再回读的时候,发现我的表达可能并不是太好懂,那么请您硬着头皮看到最后,我相信您一定能明白我的意思的)
首先,通过上面的分析,看来直接将事件处理函数注册到结构体中是不行的,因为同一个结构体,不可能包含一种以上类型的成员。那么,就让我们把这些类型的成员做个统一处理:让我们声明一个基类(FuncCaller),然后把不同的处理函数注册到它的子类(FuncItem)中去,再通过基类中提供的方法来间接调用处理函数!
不过,我可不想针对每一个可能出现事件处理函数的类,都声明一个对应的 FuncItem(因为他们包含的成员函数指针类型不同),那好,现在到了模板上场的时候了,上代码:
有了这样的定义,我就可以在FuncItem中添加一个指针类型,并定义一个成员变量:
param是事件到达时,可能传递给处理函数的数据。现在,我们在基类FuncCaller中,定义一个函数,来间接调用事件处理函数:
之所以为纯虚函数,是因为基类是没有实现它的意义的。另外,形参 obj_ptr 用来传递调用事件处理函数的对象,因为成员函数指针是需要通过类的实例来调用的。
下面来看看FuncItem类对 func_call 的实现:
差不多了,来看看现在这两个类长成什么样了:
嗯,还不错,基本的形式已经有了,不想写太长,待下一篇,再来看看具体事件处理结构的设计
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
文章转载自:博客园接DevExpress原厂商通知,将于近日上调旗下产品授权价格,现在下单客户可享受优惠报价!
面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号