2017-05-09 39 views
0

我正在寫一個C++ Builder VCL類的DLL包裝器。這是問題的一個非常簡單的例子:使用非類成員作爲事件處理函數

typedef void __fastcall (__closure *TMyEvent)(int index); 

class TMyClass { 
    public: 
    TMyEvent OnMyEvent; 
}; 

void __fastcall myEventHandler(int index) { } 

TMyClass myClass; 
myClass.OnMyEvent = myEventHandler; 

...這裏的問題是: 通常myEventHandler是另一個類中定義的,但在這裏它被定義爲一個全球性的功能。當我嘗試分配myEventHandlermyClass.OnMyEvent我得到「無法轉換無效(int)以TMyEvent」

我重用TMyClass產生不同類型的包裝,並需要在typedef__closeure所以它與VCL形式的項目運作良好。

這是問題(__closure)?我可以使用全局函數作爲事件處理程序嗎?

回答

2

__closure編譯器擴展是一種特殊類型的方法指針,它持有兩個指針 - 一個指向對象實例的指針和一個指向處理函數方法的指針。當執行__closure時,編譯器通過參數this將對象指針傳遞給處理函數。因此,處理程序必須有一個this參數。

如果處理程序是一類的非靜態成員,this指針隱式由編譯器爲您處理,如:

class TMyEvents { 
public: 
    void __fastcall myEventHandler(int index) { } 
}; 

TMyClass myClass; 
TMyEvents myEvents; 
myClass.OnMyEvent = myEvents.myEventHandler; 

如果處理程序是一個獨立的函數,或者是一個靜態方法,那麼必須顯式地在參數列表中提供this指針。在這種情況下,你可以使用TMethod 結構來幫助你分配處理程序的事件,如:

void __fastcall myEventHandler(void *Data, int index) { } 

TMethod m; 
m.Data = ...; // can be anything you want to pass to the 'Data' parameter 
m.Code = &myEventHandler; 

TMyClass myClass; 
myClass.OnMyEvent = reinterpret_cast<TMyEvent&>(m); 

:這僅適用於__closure!不要試圖將其與其他類型的函數指針一起使用。

+0

我會盡快找回來...... –

相關問題