Functionszeiger
-
Hi!
Ich will m_pGotFocus oder m_pLostFocus einen Funktionszeiger zuweisen.
So wie in meinem Code funktioniert es leider nicht.void CBaseUI::SetEventNotification(void* Func, CallBack Event) { switch (Event) { case GotFocus: m_pGotFocus = Func; break; case LostFocus: m_pLostFocus = Func; break; }; }
Fehlermeldung:
E:\Projekte\C++\Forms\forms.cpp(24) : error C2440: '=' : 'void *' kann nicht in 'void (__cdecl )(void)' konvertiert werden
Konvertierung von 'void' in Zeiger auf nicht-'void' erfordert eine explizite Typumwandlung
E:\Projekte\C++\Forms\forms.cpp(27) : error C2440: '=' : 'void *' kann nicht in 'void (__cdecl )(void)' konvertiert werden
Konvertierung von 'void' in Zeiger auf nicht-'void' erfordert eine explizite TypumwandlungWie wird das richtig gemacht?
mfg
Brian
-
Hallo,
zwischen void* und Funktionszeigern existiert keine gültige Konvertierung (zumindest nicht in Standard-C++). Du musst deiner Funktion also schon einen Funktionszeiger übergeben.
-
Hi!
Also ist es nicht möglich, irgendeinen Funktionszeiger zu übergeben, sondern es muss immer die anzahl der Argumente und der Rückgabetyp bekannt sein?
mfg
-
Brian_ schrieb:
Hi!
Also ist es nicht möglich, irgendeinen Funktionszeiger zu übergeben, sondern es muss immer die anzahl der Argumente und der Rückgabetyp bekannt sein?
mfg
Ja, das ist korrekt.
mfg
v R
-
Hi!
Habs per CopyMemory hinbekommen.
void CBaseUI::SetEventNotification(void* Func, CallBack Event) { switch (Event) { case GotFocus: CopyMemory(&m_pGotFocus, &Func, sizeof(long)); break; case LostFocus: CopyMemory(&m_pLostFocus, &Func, sizeof(long)); break; }; }
mfg
Brian
-
lol
-
warum nicht einfach so
class BaseUI { //<-- bitte ohne C Prefix, weil du sonst ua. Namespace Konflikte mit der MFC bekommen kannst! //... public: typedef void (*EventCallback_t)(); void SetEventNotification(EventCallback_t callback_handle,CallBack callback); };
oder gleich Boost::Signals
-
Dann muss aber auch die Anzahl der Argumente und der Rückgabetyp bekannt sein
-
In seinem Fall ist es das ja auch, ansonsten hätte er ja nicht das Problem, dass er einen void-Zeiger in einen void()-Zeiger casten will.