您好,登錄后才能下訂單哦!
C++中event關鍵字有什么用,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
在VC6中新建一個win32 console app,命名為“cppevent“。新建一個.h頭文件,命名為“event.h”,代碼如下:
//event.h
template <typename Handler>
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<EventHandler> 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()被調用時收到事件通知,輸出文本。
鑒于篇幅的原因,我們沒有仔細比較兩個版本的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關鍵字有什么用的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。