溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++中event關(guān)鍵字有什么用

發(fā)布時間:2021-08-06 15:54:06 來源:億速云 閱讀:209 作者:Leah 欄目:編程語言

C++中event關(guān)鍵字有什么用,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

在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. //如果要重新實現(xiàn)add/remove請在派生類中重寫這兩個函數(shù)  

  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. //構(gòu)造函數(shù)  

  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關(guān)鍵字中定義是指定事件處理函數(shù)的原型,我使用了template,為了能和C#一樣用+=和-=來定制和撤消事件,我重載了這兩個操作符(C#不支持操作符重載),為了能像C#一樣直接把event當(dāng)做函數(shù)調(diào)用,我有重載了Handler自定義轉(zhuǎn)換操作符,可惜的是,這一點模擬得不是很像,在調(diào)用時還必須來一次強制轉(zhuǎn)換才可以:(,具體參看后面的代碼:

C++版的MyClass如下:

//MyClass.h  #include "event.h"  //定義EventHandler的函數(shù)指針類型  typedef void(*EventHandler)();   class MyClass  {  public:  //構(gòu)造函數(shù)  MyClass(){};  //聲明一個事件  event<EventHandler> AEvent;  //激發(fā)事件  void FireEvent()  {  if(AEvent != NULL)   {  //C++中必須用EventHandler進行強制類型轉(zhuǎn)換  ((EventHandler)AEvent)();  };  }  };

和C#版的MyClass比較一下你就會發(fā)現(xiàn)代碼非常接近,當(dāng)然,C#是在語言級直接支持event關(guān)鍵字的,而C++不支持,用模板類代替,所以聲明事件的代碼有些不一樣。還有就是FireEvent()中C++不能把event對象直接當(dāng)做函數(shù)來調(diào)用,多了強制類型轉(zhuǎn)換。

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();//這行將導(dǎo)致MyEventHandler被調(diào)用  

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

  13. Obj.FireEvent();//這個將不會引發(fā)事件  

  14. printf("結(jié)束!\n");  

  15. char n;  

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

  17. return 0;  

  18. }  

  19. void MyEventHandler()  

  20. {  

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

我們可以看到,可C#版的客戶代碼相比,核心部分是非常接近的,我們已經(jīng)可以和C#一樣用“+=”和“-=”來定制事件和撤消事件定制,并在Obj的FireEvent()被調(diào)用時收到事件通知,輸出文本。

鑒于篇幅的原因,我們沒有仔細比較兩個版本的event的add和remove訪問器/成員函數(shù),其實二者也是非常類似的,你可以自己試試。C++版的event的add和remove均為virtual的,你可以從event類繼承出來一個MyEvent類,然后重新實現(xiàn)這兩個函數(shù),就可以定制自己的add和remove了。這和C#的add/remove訪問器的也是非常相像的。

總結(jié)

通過C++模擬event關(guān)鍵字的實現(xiàn),我們可以從更深的層次理解C#的event機制,更重要的是我們用自己所熟悉的東西(C++,模板類)來模仿并解釋了我們目前還不太熟悉的東西(C#,event)。

其實,C#的delegate就是C++的函數(shù)指針,C# event的核心機制就是C++中的模板(定義event時表現(xiàn)出來)和運算符重載(+=、-=和直接把event當(dāng)做函數(shù)調(diào)用)的結(jié)合體。C#把C++中容易出錯的部分用“新特性”封裝了起來,把這部分工作從programmer身上轉(zhuǎn)移到了compiler身上,讓我們把更多的精力集中到業(yè)務(wù)邏輯的處理上。

看完上述內(nèi)容,你們掌握C++中event關(guān)鍵字有什么用的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI