成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++模擬event關鍵字具體實現方案

開發 后端
C++模擬event關鍵字可以通過一種簡單靈活的方式來實現,在特定的情況下,能夠給我們帶來許多幫助。今天就為大家詳細介紹相關方法。

C++編程語言中,其實也是有它不能夠支持的功能,但是可以通過各種方法來進行模擬以達到編程人員程序開發的需求。在這里我們就會為大家詳細介紹有關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如下:

  1. //MyClass.h  
  2. #include "event.h"  
  3. //定義EventHandler的函數指針類型  
  4. typedef void(*EventHandler)();   
  5. class MyClass  
  6. {  
  7. public:  
  8. //構造函數  
  9. MyClass(){};  
  10. //聲明一個事件  
  11. event<EventHandler> AEvent;  
  12. //激發事件  
  13. void FireEvent()  
  14. {  
  15. if(AEvent != NULL)   
  16. {  
  17. //C++中必須用EventHandler進行強制類型轉換  
  18. ((EventHandler)AEvent)();  
  19. };  
  20. }  
  21. }; 

 

和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()被調用時收到事件通知,輸出文本。#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身上,讓我們把更多的精力集中到業務邏輯的處理上。

責任編輯:曹凱 來源: 博客園
相關推薦

2010-01-26 14:35:11

C++關鍵字

2011-07-14 23:14:42

C++static

2023-11-19 22:52:42

2010-02-01 14:46:53

C++關鍵字

2011-04-11 15:06:22

C++關鍵字

2024-03-15 11:52:03

C++關鍵字編程

2024-02-23 18:04:37

C++const關鍵字

2010-02-02 14:27:54

C++ static關

2010-02-05 15:51:06

C++ explici

2010-02-02 15:12:09

C++ explici

2011-04-21 16:57:56

staticextern

2009-09-02 09:24:03

C# this關鍵字

2009-08-21 14:58:56

C# this關鍵字

2010-02-01 13:19:09

C++ explici

2024-01-15 10:41:31

C++關鍵字開發

2024-04-08 11:35:34

C++static關鍵字

2024-01-25 11:36:08

C++構造函數關鍵字

2021-07-28 06:53:02

C++Const指針傳遞

2023-10-04 00:04:00

C++extern

2009-08-13 13:04:29

C# lock關鍵字
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕四虎 | 日本中文字幕在线观看 | 免费国产一区 | 欧美精品在欧美一区二区少妇 | 国产高清在线视频 | 天天操夜夜艹 | 视频一区 国产精品 | 欧美一级视频免费看 | 国产一区二区三区日韩 | 综合久久av | 国产一级久久久久 | 亚洲一区在线观看视频 | 91文字幕巨乱亚洲香蕉 | 亚洲欧美日韩在线不卡 | 免费一区二区 | 国产激情91久久精品导航 | 欧美成人一级 | 在线视频中文字幕 | 国产精品一区二区免费 | 蜜桃日韩 | 在线亚洲一区二区 | avtt国产 | 成av人电影在线 | 密室大逃脱第六季大神版在线观看 | 日韩精品一区二区三区中文在线 | wwwxxx国产 | 在线观看日本网站 | 一区二区三区av | 五月天天色| 国产视频精品视频 | 久久性色| 综合中文字幕 | 亚洲一区二区不卡在线观看 | 成人a在线观看 | 国产一区三区在线 | 精品一区二区三区免费毛片 | 色男人天堂av| 国产成人精品视频在线观看 | 久久午夜国产精品www忘忧草 | 中文字幕亚洲在线 | 久久在视频 |