程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++事宜處置中__event與__raise症結字的用法講授

C++事宜處置中__event與__raise症結字的用法講授

編輯:關於C++

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
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved