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 ZeigerlegasthenikerWie 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 :)!