Use a non-class member as an event handler

為{幸葍}努か 提交于 2019-12-25 11:42:53

问题


I'm writing a DLL wrapper to a C++Builder VCL class. This is an extremely simplified example of the problem:

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

class TMyClass {
  public:
    TMyEvent OnMyEvent;
};

void __fastcall myEventHandler(int index) { }

TMyClass myClass;
myClass.OnMyEvent = myEventHandler;

...and here is the problem:

Normally myEventHandler is defined inside another class, but here it is defined as a global function. When I try to assign myEventHandler to myClass.OnMyEvent I get an error

Cannot convert void(int) to TMyEvent

I reuse the TMyClass to generate different kind of wrappers and need the __closeure in the typedef so it works well with VCL form projects.

Is the __closure the problem? Can I use a global function as an event handler at all?


回答1:


The __closure compiler extension is a special type of class method pointer that holds two pointers - a pointer to an object instance, and a pointer to the handler method. When the __closure is executed, the compiler passes the object pointer to the handler via its this parameter. As such, the handler MUST have a this parameter.

If the handler is a non-static member of a class, the this pointer is handled implicitly by the compiler for you, eg:

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

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

If the handler is a standalone function, or is a static method of a class, then the this pointer must be provided in the parameter list explicitly. In this situation, you can use the TMethod1 struct to help you assign the handler to the event, eg:

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);

1: this only works with __closure! Don't try to use it with other types of function pointers.



来源:https://stackoverflow.com/questions/43870540/use-a-non-class-member-as-an-event-handler

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!