返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中event关键字有什么用
  • 673
分享到

C++中event关键字有什么用

2023-06-17 17:06:15 673人浏览 八月长安
摘要

c++中event关键字有什么用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在VC6中新建一个win32 console app,命名为“cppevent“。新建一个.h头文

c++中event关键字有什么用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

在VC6中新建一个win32 console app,命名为“cppevent“。新建一个.h头文件,命名为“event.h”,代码如下:

  1. //event.h  

  2. template <typename Handler> 

  3. class event  

  4. {  

  5. private:  

  6. Handler m_Handler;  

  7. protected:  

  8. //模拟C# event 的add/remove访问器  

  9. //如果要重新实现add/remove请在派生类中重写这两个函数  

  10. virtual void add(const Handler value){m_Handler = value;};  

  11. virtual void remove(const Handler value)
    {if(value == m_Handler)m_Handler = NULL;};  

  12. public:  

  13. //构造函数  

  14. event():m_Handler(NULL){}  

  15. //+= 操作符  

  16. event& operator += (const Handler value)  

  17. {  

  18. add(value);  

  19. return *this;  

  20. }  

  21. //-=操作符  

  22. event& operator -= (const Handler value)  

  23. {  

  24. remove(value);  

  25. return *this;  

  26. }  

  27. //PFN_EVENT_HANDLE 操作符  

  28. operator Handler()  

  29. {  

  30. return m_Handler;  

  31. }  

  32. }; 

为了能够在在C++模拟event关键字中定义是指定事件处理函数的原型,我使用了template,为了能和C#一样用+=和-=来定制和撤消事件,我重载了这两个操作符(C#不支持操作符重载),为了能像C#一样直接把event当做函数调用,我有重载了Handler自定义转换操作符,可惜的是,这一点模拟得不是很像,在调用时还必须来一次强制转换才可以:(,具体参看后面的代码:

C++版的MyClass如下:

//MyClass.h  #include "event.h"  //定义EventHandler的函数指针类型  typedef void(*EventHandler)();   class MyClass  {  public:  //构造函数  MyClass(){};  //声明一个事件  event<EventHandler> AEvent;  //激发事件  void FireEvent()  {  if(AEvent != NULL)   {  //C++中必须用EventHandler进行强制类型转换  ((EventHandler)AEvent)();  };  }  };

和C#版的MyClass比较一下你就会发现代码非常接近,当然,C#是在语言级直接支持event关键字的,而C++不支持,用模板类代替,所以声明事件的代码有些不一样。还有就是FireEvent()中C++不能把event对象直接当做函数来调用,多了强制类型转换。

C++版的客户代码如下:

  1. // cppevent.cpp : Defines the entry point for 
    the console application.  

  2. //  

  3. #include "stdafx.h"  

  4. #include "MyClass.h"  

  5. //向前声明  

  6. void MyEventHandler();   

  7. int main(int arGC, char* argv[])  

  8. {  

  9. MyClass Obj;  

  10. Obj.AEvent += MyEventHandler;//定制事件  

  11. Obj.FireEvent();//这行将导致MyEventHandler被调用  

  12. Obj.AEvent -= MyEventHandler;//撤消事件  

  13. Obj.FireEvent();//这个将不会引发事件  

  14. printf("结束!\n");  

  15. char n;  

  16. scanf("%c", &n);  

  17. return 0;  

  18. }  

  19. void MyEventHandler()  

  20. {  

  21. printf("This is a event!\n");  

我们可以看到,可C#版的客户代码相比,核心部分是非常接近的,我们已经可以和C#一样用“+=”和“-=”来定制事件和撤消事件定制,并在Obj的FireEvent()被调用时收到事件通知,输出文本。

鉴于篇幅的原因,我们没有仔细比较两个版本的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关键字有什么用的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网其他教程频道,感谢各位的阅读!

--结束END--

本文标题: C++中event关键字有什么用

本文链接: https://lsjlt.com/news/290816.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++中event关键字有什么用
    C++中event关键字有什么用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在VC6中新建一个win32 console app,命名为“cppevent“。新建一个.h头文...
    99+
    2023-06-17
  • C++中inline关键字有什么作用
    本篇内容介绍了“C++中inline关键字有什么作用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!inline关键字:目的:在 c/c++ ...
    99+
    2023-06-21
  • C语言中volatile 关键字有什么用
    这期内容当中小编将会给大家带来有关C语言中volatile 关键字有什么用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、关键字 volatile 是什么volatile是一个类型修饰符(type sp...
    99+
    2023-06-16
  • C#的using关键字有什么用
    这篇文章主要讲解了“C#的using关键字有什么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#的using关键字有什么用”吧!在任何 C# 程序中的第一条语句都是:using ...
    99+
    2023-06-17
  • C语言typedef关键字有什么作用
    本篇内容主要讲解“C语言typedef关键字有什么作用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言typedef关键字有什么作用”吧!1、来个笑话赵本山在春晚有一个这样的笑话,是这样的有...
    99+
    2023-06-03
  • JavaScript中this关键字有什么用
    本篇内容主要讲解“JavaScript中this关键字有什么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript中this关键字有什么用”吧!与...
    99+
    2024-04-02
  • Java中volatile关键字有什么用
    这篇文章将为大家详细讲解有关Java中volatile关键字有什么用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。概述Java语言中关键字 volatile 被称作轻量级的 synchron...
    99+
    2023-06-19
  • Java中this关键字有什么用
    这篇文章主要介绍了Java中this关键字有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。this 关键字this 关键字代表了所属函数的调用者对象。this 关键字的...
    99+
    2023-06-27
  • JAVA中public关键字有什么用
    本篇文章给大家分享的是有关JAVA中public关键字有什么用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。      JAVA类声明中关键字pu...
    99+
    2023-06-03
  • java中super关键字有什么用
    在Java中,super关键字有以下几种用途:1. 调用父类的构造方法:在子类的构造方法中,可以使用super关键字来调用父类的构造...
    99+
    2023-08-24
    java super
  • oracle中rename关键字有什么用
    在Oracle中,RENAME关键字用于重命名指定的表、列或者其他数据库对象。具体用法如下:1. 重命名表:   ```...
    99+
    2024-02-29
    oracle
  • C# 中this关键字的作用是什么
    这篇文章给大家介绍C# 中this关键字的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。以下是 this 的常用用途:◆限定被相似的名称隐藏的成员◆将对象作为参数传递到其他方法◆声明索引器C# this关键字...
    99+
    2023-06-17
  • C# 中base关键字的作用是什么
    今天就跟大家聊聊有关C# 中base关键字的作用是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。C# base关键字用于从派生类中访问基类的成员:调用基类上已被其他方法重写的方法...
    99+
    2023-06-17
  • C#中 New关键字的作用是什么
    C#中 New关键字的作用是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、在C#中,new这个关键字使用频率非常高,主要有3个功能:1)作为运算符用来创建一个对象和调用...
    99+
    2023-06-17
  • C++中explicit关键字的作用是什么
    本篇文章为大家展示了C++中explicit关键字的作用是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。如果C++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对...
    99+
    2023-06-17
  • C# 中using关键字的作用是什么
    今天就跟大家聊聊有关C# 中using关键字的作用是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。C# using关键字微软MSDN上解释总共有三种用途:引用命名空间,这样就可以...
    99+
    2023-06-18
  • C# 中lock关键字的作用是什么
    这篇文章将为大家详细讲解有关C# 中lock关键字的作用是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C#提供了一个关键字lock,它可以把一段代码定义为互斥段(critical se...
    99+
    2023-06-18
  • C#中that关键字的作用是什么
    C#中that关键字的作用是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。如果在C#增加that关键字,将会表示什么意思简单分析可以发现,C#增加that关...
    99+
    2023-06-18
  • c#中uint关键字的用法是什么
    在C#中,uint关键字用于声明一个32位无符号整数。uint关键字在内存中占据4个字节(32位),其取值范围为0到42949672...
    99+
    2024-03-11
    c#
  • static关键字在Java中有什么用
    本文章向大家介绍static关键字在Java中有什么用的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允...
    99+
    2023-06-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作