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
}