PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Statische Member-Funktionen und nicht-statische Member -> Fehler


Nasenbaer
2003-02-03, 14:37:12
Hi,
ich habe eine Klasse geschrieben in der sich eine Callback Funktion befindet. Ich hab sie als static deklariert, weil die ja für Callback-Funktionen nötig ist.
Nun möchte ich aber nicht-statischen Membern Werte zuweisen. Allerdings erhalte ich dann einen Fehler.

Wie könnte man diese Problem umgehen? Die Member einfach auch static deklarieren oder gibts auch andere Lösungen?

Mfg Nasenbaer

Demirug
2003-02-03, 14:52:04
Ja die Member auch als static zu deklarieren ist der einfachste Weg. Für eine andere Lösung bräuchte ich noch ein paar Details mehr.

Nasenbaer
2003-02-03, 15:19:07
Ok danke erstmal. Aber wenn du Lust hast kannst du ja auch nach ner anderen Lösung fahnden. :D

Die Header-Datei

// File: DirectInput.h


// I N C L U D E S /////////////////////////////////////////////////////////
#include <dinput.h>
#include "main.h"

// D E F I N E S ///////////////////////////////////////////////////////////
#define MAX_JOYSTICK_BUTTONS 4
#define MAX_MOUSE_BUTTONS 4
#define INPUT_BUFFER_SIZE 32



// M A K R O S /////////////////////////////////////////////////////////////
#define TASTE(Taste) (Tasten_Puffer[Taste] & 0x80)


// P R O T O T Y P E S /////////////////////////////////////////////////////

class xDirectInput
{
public:
xDirectInput( HWND hwnd, int Width, int Height );
~xDirectInput( void );

BOOL Initialize( HINSTANCE hInstance, BOOL BufMouse );
BOOL Keyboard_Update( void );
BOOL Mouse_Update( void );
static BOOL CALLBACK Enum_JoyDev(const DIDEVICEINSTANCE *pDIDInstance, LPVOID lpContext );
BOOL Joystick_Create( void );
BOOL Joystick_Update( void );
BOOL Update( void );
void Terminate( void );
private:
HWND hWnd; //! Handle for Window which uses Direct Input
int Screen_Width; //! Save Width of Screen
int Screen_Height; //! Save Height of Screen

LPDIRECTINPUT8 lpDI; //! Main-Interface of Direct Input
LPDIRECTINPUTDEVICE8 lpDIKeyboard; //! Keyboard Device Interface
LPDIRECTINPUTDEVICE8 lpDIMouse; //! Mouse Device Interface
LPDIRECTINPUTDEVICE8 lpDIJoystick; //! Joystick Device Interface
GUID guidJoy_Dev; //! GUID of Joystick Device

BOOL bBuffered_Mouse; //! Mouse buffered?
int iMouse_x; //! X-Coordinate of Mouse Cursor
int iMouse_y; //! Y-Coordinate of Mouse Cursor
BOOL bMouse_Buttons[MAX_MOUSE_BUTTONS]; //! Mouse-Button pressed?

BOOL bJoystick; //! Joystick available?
int iJoystick_x; //! X-Coordinate of Joystick
int iJoystick_y; //! Y-Coordinate of Joystick
BOOL bJoystickButttons[MAX_JOYSTICK_BUTTONS]; //! Joystick-Button pressed?
char strJoy_Name[50]; //! Joystick Productname
char Key_Buffer[256]; //! Keyboard Status

// Hat Eingabe stattgefunden?
BOOL Input[AK_MAXIMAL];
};



Die dazu passende DirectInput.cpp mit der Callback-Funktion

// Enum_JoyDev()
// Enumerates Joystick-Devices and saves the GUID
//---------------------------------------------------------------------------------
BOOL CALLBACK xDirectInput::Enum_JoyDev(const DIDEVICEINSTANCE *pDIDInstance, LPVOID lpContext )
{
// lpContext an a pointer which points to the third parameter of EnumDevices
// Function
// lpContext is Const - that's why pguidDevice is needed to apply the GUID Instance

GUID *pguidDevice = NULL;
if ( lpContext )
{
pguidDevice = (GUID *)lpContext;
*pguidDevice = pDIDInstance->guidInstance;
}

// Copy Name of Joystick
strcpy( strJoy_Name, (char *)pDIDInstance->tszProductName );

// force Joystick activation
bJoystick = TRUE;

// Stop Enumeration
return DIENUM_STOP;
}
//---------------------------------------------------------------------------------

Demirug
2003-02-03, 15:31:07
Sag doch gleich das du Direkt Input Geräte enumieren möchtest. ;)


--------------------------------------------------------------------------------
// Enum_JoyDev()
// Enumerates Joystick-Devices and saves the GUID
//---------------------------------------------------------------------------------
BOOL CALLBACK xDirectInput::Enum_JoyDev(const DIDEVICEINSTANCE *pDIDInstance, LPVOID lpContext )
{
xDirectInput* pInput = (xDirectInput*)lpContext;

// memcpy (&pInput->deviceguid, &pDIDInstance->guidInstance, sizeof(GUID)); bitte so auch im Object speichern
// Copy Name of Joystick
strcpy( pInput->strJoy_Name, (char *)pDIDInstance->tszProductName );

// force Joystick activation
pInput->bJoystick = TRUE;

// Stop Enumeration
return DIENUM_STOP;
}
//---------------------------------------------------------------------------------


Beim Aufruf von EnumDevices als 3 Parameter einen Zeiger auf das Object übergeben.

Nasenbaer
2003-02-03, 16:05:31
Originally posted by Demirug
Beim Aufruf von EnumDevices als 3 Parameter einen Zeiger auf das Object übergeben.

Soll ich die Klasse instantieren und dann einen Zeiger auf selbiges Objekt der EnumDevices Funktion übergeben?

Mfg Nasenbaer

Demirug
2003-02-03, 16:55:33
Originally posted by Nasenbaer


Soll ich die Klasse instantieren und dann einen Zeiger auf selbiges Objekt der EnumDevices Funktion übergeben?

Mfg Nasenbaer

ja, genau so ist das gemeint.

Nasenbaer
2003-02-03, 18:49:46
Gibt es unter C++ eigentlich auch einen This-Pointer der immer auf das Objekt zeigt? Ich kenn das aus PHP und muss sagen, dass sowas ne feine Sache ist.

Mfg Nasenbaer

zeckensack
2003-02-03, 18:58:46
Originally posted by Nasenbaer
Gibt es unter C++ eigentlich auch einen This-Pointer der immer auf das Objekt zeigt? Ich kenn das aus PHP und muss sagen, dass sowas ne feine Sache ist.

Mfg Nasenbaer Klar, du mußt ihn nur klein schreiben :)
Allerdings gibt's den eben nur in nicht-statischen Memberfunktionen. ;)

Nasenbaer
2003-02-03, 19:16:56
Dann kann man doch auch folgendes bauen oder ist das kein schöner Programmierstil?


class Dinput
{
private:
DInput *THIS;
DInput *GetThis( void );
};

DInput *Dinput::GetThis( void )
{
return this;
}


Und schon hab ich den Pointer auch in ner statischen Funktion. =)

Mfg Nasenbaer

Demirug
2003-02-03, 19:26:07
Originally posted by Nasenbaer
Dann kann man doch auch folgendes bauen oder ist das kein schöner Programmierstil?


class Dinput
{
private:
DInput *THIS;
DInput *GetThis( void );
};

DInput *Dinput::GetThis( void )
{
return this;
}


Und schon hab ich den Pointer auch in ner statischen Funktion. =)

Mfg Nasenbaer

Nein hast du nicht. Du kannst aus einer statischen Funktion keine nicht statische aufrufen.

Nasenbaer
2003-02-03, 19:49:17
Bei EnumDevices() kann man dann doch aber this reinschreiben denn diese ist ja nicht statisch. Wodruch die Funktion, die icht vorhin postete aber auch überflüssig werden würde.
Oder verdreh ich da wieder was? ;D

Mfg Nasenbaer

Demirug
2003-02-03, 19:55:25
Originally posted by Nasenbaer
Bei EnumDevices() kann man dann doch aber this reinschreiben denn diese ist ja nicht statisch. Wodruch die Funktion, die icht vorhin postete aber auch überflüssig werden würde.
Oder verdreh ich da wieder was? ;D

Mfg Nasenbaer

this ist nur innerhalb einer nicht statischen Methode verfügbar.

EnumDevices kannst du ja wie gesagt einfach einen Zeiger auf dein Object übergeben.

zeckensack
2003-02-03, 21:22:16
Ich habe sowas noch nicht selbst gemacht, aber das ist mir gerade in der Bahn eingefallen =)
class
Input
{
public:
//blablabla
private:
static Input* current_instance;

static void set_instance(Input* instance) {current_instance=instance;}
static BOOL CALLBACK Enum_JoyDev(<...>;
};

So, bevor man jetzt mit dem Enumerieren anfängt, setzt man mit set_instance(this); den statischen Instanz-Zeiger auf das aktuelle Objekt. Man kann natürlich auch erstmal den alten Wert sichern, und nach dem Enumerieren wiederherstellen.

Innerhalb des statischen Callbacks kann man dann Daten und Funktionen des Objekts benutzen:
instance->whatever

Nasenbaer
2003-02-03, 21:39:30
Thx.
Werds dann mal morgen ausprobieren.

Mfg Nasenbaer