C++事宜處置中__event與__raise症結字的用法講授。本站提示廣大學習愛好者:(C++事宜處置中__event與__raise症結字的用法講授)文章只能為提供參考,不一定能成為您想要的結果。以下是C++事宜處置中__event與__raise症結字的用法講授正文
__event
聲明事宜。
語法
__event method-declarator ; __event __interface interface-specifier; __event member-declarator;
備注
症結字 __event 可運用於辦法聲明、接口聲明或數據成員聲明。然則,不克不及應用 __event 症結字限制嵌套類的成員。
依據您的事宜源和吸收器是本機 C++、COM 照樣托管 (.NET Framework),您可以使用以下結構作為事宜:
在事宜吸收器中應用 __hook 可將處置法式辦法與事宜辦法聯系關系。請留意,應用 __event 症結字創立一個事宜以後,將在挪用此事宜時挪用後來掛鉤到它的一切事宜處置法式。
__event 辦法聲明不克不及具有界說;界說是隱式生成的,是以可將事宜辦法當作任何通俗辦法一樣挪用。
System_CAPS_note留意
模板類或構造不克不及包括事宜。
本機事宜
本機事宜是辦法。前往類型平日是 HRESULT 或 void,但可所以任何整型(包含 enum)。當事宜應用整數前往類型時,假如事宜處置法式前往非零值,則會界說毛病前提,在這類情形下,激發的事宜將挪用其他拜托。
// Examples of native C++ events: __event void OnDblClick(); __event HRESULT OnClick(int* b, char* s);
有關代碼示例,請參閱本機 C++ 中的事宜處置。
COM 事宜
COM 事宜是接口。事宜源接口中的辦法的參數應為 in 參數(但這不是強迫請求的),由於 out 參數在多播時無用。假如應用 out 參數,則將收回 1 級正告。
前往類型平日是 HRESULT 或 void,但可所以任何整型(包含 enum)。當事宜應用整數前往類型而且事宜處置法式前往非零值時,這是毛病情形,此時激發的事宜將中斷對其他拜托的挪用。請留意,編譯器會主動將一個事宜源接口標志為生成的 IDL 中的源。
COM 事宜源的 __event 以後一直須要 __interface 症結字。
// Example of a COM event: __event __interface IEvent1;
有關代碼示例,請參閱 COM 中的事宜處置。
托管事宜
有關新語法中的編碼事宜的信息,請參閱event(C++ 組件擴大)。
托管事宜是數據成員或辦法。當與事宜一路應用時,拜托的前往類型必需相符公共說話標准。事宜處置法式的前往類型必需與拜托的前往類型婚配。有關拜托的具體信息,請參閱 __delegate。假如托管事宜是數據成員,則其類型必需是指向拜托的指針。
在 .NET Framework 中,您可以將數據成員視為辦法自己(即,其對應拜托的 Invoke 辦法)。您必需預界說用於聲明托管事宜數據成員的拜托類型。相反,假如還沒有界說對應的托管拜托,則托管事宜辦法將隱式界說它。例如,您可以將事宜值(如 OnClick)聲明為上面所示的事宜:
// Examples of managed events: __event ClickEventHandler* OnClick; // data member as event __event void OnClick(String* s); // method as event
隱式聲明托管事宜時,您可以指定添加或移除添加或移除事宜處置法式時將挪用的 add 和 remove 拜訪器。您還可以界說從類內部挪用(激發)事宜的辦法。
示例:本機事宜
// EventHandling_Native_Event.cpp // compile with: /c [event_source(native)] class CSource { public: __event void MyEvent(int nValue); };
示例:COM 事宜
// EventHandling_COM_Event.cpp // compile with: /c #define _ATL_ATTRIBUTES 1 #include <atlbase.h> #include <atlcom.h> [ module(dll, name="EventSource", uuid="6E46B59E-89C3-4c15-A6D8-B8A1CEC98830") ]; [ dual, uuid("00000000-0000-0000-0000-000000000002") ] __interface IEventSource { [id(1)] HRESULT MyEvent(); }; [ coclass, uuid("00000000-0000-0000-0000-000000000003"), event_source(com) ] class CSource : public IEventSource { public: __event __interface IEventSource; HRESULT FireEvent() { __raise MyEvent(); return S_OK; } };
示例:托管事宜
// EventHandling_Managed_Event.cpp // compile with: /clr:oldSyntax /c using namespace System; [event_source(managed)] public __gc class CPSource { public: __event void MyEvent(Int16 nValue); };
將特征運用於事宜時,您可以指定特征運用於生成的辦法照樣生成的拜托的 Invoke 辦法。默許值 (event:) 用於將特征運用於事宜。
// EventHandling_Managed_Event_2.cpp // compile with: /clr:oldSyntax /c using namespace System; [attribute(All, AllowMultiple=true)] public __gc class Attr {}; public __delegate void D(); public __gc class X { public: [method:Attr] __event D* E; [returnvalue:Attr] __event void noE(); };
__raise
強調一個事宜的挪用站點。
__raise method-declarator;
備注
在托管代碼中,事宜只能從界說它的類中激發。
解釋
模板類或構造不克不及包括事宜。
示例
// EventHandlingRef_raise.cpp struct E { __event void func1(); void func1(int) {} void func2() {} void b() { __raise func1(); __raise func1(1); // C3745: 'int Event::bar(int)': // only an event can be 'raised' __raise func2(); // C3745 } }; int main() { E e; __raise e.func1(); __raise e.func1(1); // C3745 __raise e.func2(); // C3745 }