日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
C++模擬event關(guān)鍵字具體實(shí)現(xiàn)方案

在C++編程語(yǔ)言中,其實(shí)也是有它不能夠支持的功能,但是可以通過(guò)各種方法來(lái)進(jìn)行模擬以達(dá)到編程人員程序開(kāi)發(fā)的需求。在這里我們就會(huì)為大家詳細(xì)介紹有關(guān)C++模擬event關(guān)鍵字的相關(guān)操作方法。

在VC6中新建一個(gè)win32 console app,命名為“cppevent“。新建一個(gè).h頭文件,命名為“event.h”,代碼如下:

 
 
 
  1. //event.h  
  2. template  
  3. class event  
  4. {  
  5. private:  
  6. Handler m_Handler;  
  7. protected:  
  8. //模擬C# event 的add/remove訪(fǎng)問(wèn)器  
  9. //如果要重新實(shí)現(xiàn)add/remove請(qǐng)?jiān)谂缮?lèi)中重寫(xiě)這兩個(gè)函數(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#一樣用+=和-=來(lái)定制和撤消事件,我重載了這兩個(gè)操作符(C#不支持操作符重載),為了能像C#一樣直接把event當(dāng)做函數(shù)調(diào)用,我有重載了Handler自定義轉(zhuǎn)換操作符,可惜的是,這一點(diǎn)模擬得不是很像,在調(diào)用時(shí)還必須來(lái)一次強(qiáng)制轉(zhuǎn)換才可以:(,具體參看后面的代碼:

C++版的MyClass如下:

 
 
 
  1. //MyClass.h  
  2. #include "event.h"  
  3. //定義EventHandler的函數(shù)指針類(lèi)型  
  4. typedef void(*EventHandler)();   
  5. class MyClass  
  6. {  
  7. public:  
  8. //構(gòu)造函數(shù)  
  9. MyClass(){};  
  10. //聲明一個(gè)事件  
  11. event AEvent;  
  12. //激發(fā)事件  
  13. void FireEvent()  
  14. {  
  15. if(AEvent != NULL)   
  16. {  
  17. //C++中必須用EventHandler進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換  
  18. ((EventHandler)AEvent)();  
  19. };  
  20. }  
  21. }; 

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

C++版的客戶(hù)代碼如下:

 
 
 
  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();//這個(gè)將不會(huì)引發(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#版的客戶(hù)代碼相比,核心部分是非常接近的,我們已經(jīng)可以和C#一樣用“+=”和“-=”來(lái)定制事件和撤消事件定制,并在Obj的FireEvent()被調(diào)用時(shí)收到事件通知,輸出文本。#t#

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

總結(jié)

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

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


當(dāng)前名稱(chēng):C++模擬event關(guān)鍵字具體實(shí)現(xiàn)方案
網(wǎng)頁(yè)鏈接:http://www.dlmjj.cn/article/dhejsie.html