Funktionspointer bzw. Methodenpointer per Set-Methode übergeben
-
Hallo zusammen,
Ich habe einen Funktionspointer, den ich sozusagen mit einer Set Methode an eine Klasse übergeben möchte, allerdings macht das ganze noch ein paar Probleme, vielleicht habt ihr ja eine Idee, wie es richtig Funktioniert.Hier zunächst einmal eine Klasse, wo die Methode zum setzen des Funktionspointers aufgerufen wird.
class CGame { public: int StartClient(CString arg_stIP, unsigned int arg_iPort); int StartServer(unsigned int arg_iPort); CGame(); virtual ~CGame(); private: static void (CGame::OnSocketAccept) (); CPlayer m_Player1; }; int CGame::StartServer(unsigned int arg_iPort) { m_Player1.SetOnAcceptFunction( &OnSocketAccept ); //Hier wird der Pointer auf die Methode übergeben return m_Player1.StartServer(arg_iPort); }
Hier die Klasse, an die der Funktionspointer übergeben werden soll.
class CPlayer : private CAsyncSocket { // Attribute public: // Operationen public: CPlayer(); virtual ~CPlayer(); public: void SetOnAcceptFunction( void * arg_OnAccept ); int StartClient( CString arg_stIP, unsigned int arg_iPort ); int StartServer( unsigned int arg_iPort ); protected: virtual void OnAccept( int nErrorCode ); private: void (CPlayer::* m_OnAccept) (); //Mein Funktionspointer }; void CPlayer::OnAccept(int nErrorCode) { AfxMessageBox("Accept vor weiterleitung"); m_OnAccept(); //Hier soll die übergebene Funktion aufgerufen werden } void CPlayer::SetOnAcceptFunction(void *arg_OnAccept) { m_OnAccept = arg_OnAccept; //Hier soll die zuweisung des Funktionspointers erfolgen }
Der Aufruf des Pointers führt aber zur Zeit leider zu folgendem Fehler:
m_OnAccept();
error C2064: Ausdruck ergibt keine FunktionDie Zuweisung des Pointers ist leider ebenfalls nicht fehlerfrei:
m_OnAccept = arg_OnAccept;
error C2440: '=' : 'void ' kann nicht in 'void (__thiscall CPlayer::)(void)' konvertiert werden-danke im vorraus-
hever
-
Er sagt doch schon alles:
void* kann nicht in void (CPlayer::*)(void)
konvertiert werdenAlso machst du den Parameter zu einem void (CPlayer::*)(void)
-
Die Konvertierung geht noch nicht einmal anderherum: Funktionszeiger und Elementfunktionszeiger müssen nicht in einen void* passen. Aber ich sehe schon nicht, was die Deklaration von CGame::OnSocketAccept darstellen soll. Einfach nur eine statische Funktion? Dann gehört das CGame:: im Klassenblock weg.
Und dann macht es nicht viel Sinn, eine statische Methode in eine Elementfunktion eines Players konvertieren zu wollen; willst du vielleicht eigentlich nur ein "void (*funktion)()" an CPlayer übergeben? Dann gehören die ganzen CPlayer::-Zeiger weg. Was auch immer du machst, mach es ohne Casts - die werden bei Funktionszeigern oft verwendet, obwohl sie eigentlich bestenfalls gar nicht helfen...