Zeiger auf Methode in derselben Klasse



  • Hallo zusammen.
    Leider weiss ich dass das ein typischer Fall für FAQ-Suche ist, jedoch komm ich einfach nicht drauf. Bitte habt Mitleid ich bin noch etwas zu neu und außerdem bin ich absoluter Zeigerlegastheniker 😕

    Wie krieg ich hier hin, dass die Methode derselben Klasse akzeptiert wird?

    // Callback für die Tastaturauflistung
        BOOL CALLBACK G3XKeyboard::EnumDevicesIntern(LPCDIDEVICEINSTANCE pDevInst,void* pRef)
        {
            // Anzahl verfügbarer Tastaturen hinzufügen
            m_iDevices++;
            return true;
        }
    
        // Anzahl aller angeschlossenen Tastaturen aktualisieren
        INT G3XKeyboard::QueryAvaiableKeyboards(bool bAttachedonly)
        {
            // Falls die Engine initialisiert (auch im schlafzustand) ist
            if(GetInterfaceState()!=G3XKBS_RELEASED)
            {
                if(bAttachedonly)
                {
                    // Geräteabzählung beginnt [DIEDFL_ATTACHEDONLY]
    
                                                                      // Das ist der Übeltäter
                    m_hr=m_lpDinput->EnumDevices(DI8DEVCLASS_KEYBOARD,EnumDevicesIntern,NULL,DIEDFL_ATTACHEDONLY);
                    if(FAILED(m_hr))
                    {
                        return -1;
                    }
                }
                else
                {                
                    // Geräteabzählung beginnt [DIEDFL_ALLDEVICES]
                                                                      // Das ist der Übeltäter
                    m_hr=m_lpDinput->EnumDevices(DI8DEVCLASS_KEYBOARD,EnumDevicesIntern,NULL,DIEDFL_ALLDEVICES);
                    if(FAILED(m_hr))
                    {
                        return -1;
                    }
    
                }
            }
        }
    

    1>------ Erstellen gestartet: Projekt: engine, Konfiguration: Debug Win32 ------
    1> keyboard.cpp
    1> d:\programme\microsoft visual studio 10.0\vc\include\dinput.h: DIRECTINPUT_VERSION undefined. Defaulting to version 0x0800
    1>j:\xp\eigene dateien\visual studio 2010\projects\engine\engine\keyboard.cpp(50): error C2664: 'IDirectInput8W::EnumDevices': Konvertierung des Parameters 2 von 'void (__thiscall G3X_ENGINE::G3XKeyboard::* )(LPCDIDEVICEINSTANCE,LPVOID)' in 'LPDIENUMDEVICESCALLBACKW' nicht möglich
    1> Es gibt keinen Kontext, in dem diese Konvertierung möglich ist
    1>j:\xp\eigene dateien\visual studio 2010\projects\engine\engine\keyboard.cpp(59): error C2664: 'IDirectInput8W::EnumDevices': Konvertierung des Parameters 2 von 'void (__thiscall G3X_ENGINE::G3XKeyboard::* )(LPCDIDEVICEINSTANCE,LPVOID)' in 'LPDIENUMDEVICESCALLBACKW' nicht möglich
    1> Es gibt keinen Kontext, in dem diese Konvertierung möglich ist
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========



  • Mach in der Klasse G3XKeyboard folgende statische Funktion dazu:

    class G3XKeyboard {
    ...
        protected: // Oder private
            static BOOL EnumDevicesInternRaw( LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef ) {
                G3XKeyboard* Me = static_cast<G3XKeyboard*>( pvRef );
                return Me->EnumDevicesIntern( lpddi, NULL );
            }
    

    Die Funktion EnumDevices rufst du dann mit EnumDevicesInternRaw,this als zweiten und dritten Parameter auf.

    Memberfunktionszeiger sind komplexer als einfache Funktionszeiger, deshalb braucht man hier so einen Workaround. Zeiger auf statische Memberfunktionen wiederum sind so wie normale Funktionszeiger.



  • Danke :)!


Log in to reply