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 Typumwandlung

    Wie 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.


Anmelden zum Antworten