在C++编程语言中,其实也是有它不能够支持的功能,但是可以通过各种方法来进行模拟以达到编程人员程序开发的需求。在这里我们就会为大家详细介绍有关C++模拟event关键字的相关操作方法。

在VC6中新建一个win32 console app,命名为“cppevent“。新建一个.h头文件,命名为“event.h”,代码如下:
- //event.h
 - template
 - class event
 - {
 - private:
 - Handler m_Handler;
 - protected:
 - //模拟C# event 的add/remove访问器
 - //如果要重新实现add/remove请在派生类中重写这两个函数
 - virtual void add(const Handler value){m_Handler = value;};
 - virtual void remove(const Handler value)
 
{if(value == m_Handler)m_Handler = NULL;};- public:
 - //构造函数
 - event():m_Handler(NULL){}
 - //+= 操作符
 - event& operator += (const Handler value)
 - {
 - add(value);
 - return *this;
 - }
 - //-=操作符
 - event& operator -= (const Handler value)
 - {
 - remove(value);
 - return *this;
 - }
 - //PFN_EVENT_HANDLE 操作符
 - operator Handler()
 - {
 - return m_Handler;
 - }
 - };
 
为了能够在在C++模拟event关键字中定义是指定事件处理函数的原型,我使用了template,为了能和C#一样用+=和-=来定制和撤消事件,我重载了这两个操作符(C#不支持操作符重载),为了能像C#一样直接把event当做函数调用,我有重载了Handler自定义转换操作符,可惜的是,这一点模拟得不是很像,在调用时还必须来一次强制转换才可以:(,具体参看后面的代码:
C++版的MyClass如下:
- //MyClass.h
 - #include "event.h"
 - //定义EventHandler的函数指针类型
 - typedef void(*EventHandler)();
 - class MyClass
 - {
 - public:
 - //构造函数
 - MyClass(){};
 - //声明一个事件
 - event
 AEvent; - //激发事件
 - void FireEvent()
 - {
 - if(AEvent != NULL)
 - {
 - //C++中必须用EventHandler进行强制类型转换
 - ((EventHandler)AEvent)();
 - };
 - }
 - };
 
和C#版的MyClass比较一下你就会发现代码非常接近,当然,C#是在语言级直接支持event关键字的,而C++不支持,用模板类代替,所以声明事件的代码有些不一样。还有就是FireEvent()中C++不能把event对象直接当做函数来调用,多了强制类型转换。
C++版的客户代码如下:
- // cppevent.cpp : Defines the entry point for
 
the console application.- //
 - #include "stdafx.h"
 - #include "MyClass.h"
 - //向前声明
 - void MyEventHandler();
 - int main(int argc, char* argv[])
 - {
 - MyClass Obj;
 - Obj.AEvent += MyEventHandler;//定制事件
 - Obj.FireEvent();//这行将导致MyEventHandler被调用
 - Obj.AEvent -= MyEventHandler;//撤消事件
 - Obj.FireEvent();//这个将不会引发事件
 - printf("结束!\n");
 - char n;
 - scanf("%c", &n);
 - return 0;
 - }
 - void MyEventHandler()
 - {
 - printf("This is a event!\n");
 - }
 
我们可以看到,可C#版的客户代码相比,核心部分是非常接近的,我们已经可以和C#一样用“+=”和“-=”来定制事件和撤消事件定制,并在Obj的FireEvent()被调用时收到事件通知,输出文本。#t#
鉴于篇幅的原因,我们没有仔细比较两个版本的event的add和remove访问器/成员函数,其实二者也是非常类似的,你可以自己试试。C++版的event的add和remove均为virtual的,你可以从event类继承出来一个MyEvent类,然后重新实现这两个函数,就可以定制自己的add和remove了。这和C#的add/remove访问器的也是非常相像的。
总结
通过C++模拟event关键字的实现,我们可以从更深的层次理解C#的event机制,更重要的是我们用自己所熟悉的东西(C++,模板类)来模仿并解释了我们目前还不太熟悉的东西(C#,event)。
其实,C#的delegate就是C++的函数指针,C# event的核心机制就是C++中的模板(定义event时表现出来)和运算符重载(+=、-=和直接把event当做函数调用)的结合体。C#把C++中容易出错的部分用“新特性”封装了起来,把这部分工作从programmer身上转移到了compiler身上,让我们把更多的精力集中到业务逻辑的处理上。
                名称栏目:C++模拟event关键字具体实现方案
                
                分享链接:http://www.csdahua.cn/qtweb/news22/346072.html
            
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网