Class Member als Funktionszeiger übergeben



  • Hallo,
    ich programmiere gerade Wrapper-Klassen für die SDL. Nun steht ich beim programmieren der Timer Klasse vor einem Problem. Ich stelle die Frage im allgemein C++-Forum, da diese Frage nicht SDL-spezifisch ist.
    Aber nun zum Problem: Mein Vorhaben sieht so aus, das ich eine abstrakte Klasse definiere, die die Funktion CallbackFunction() beinhaltet. Diese Funktion soll bei jeder Ableitung neu geschrieben werden. Um nun den Timer zu aktivieren, ruft die Funktion Add() die SDL-Funktion SDL_AddTimer() auf. Diese Funktion benötigt einen Funktionszeiger (Definition siehe http://www.libsdl.org/cgi/docwiki.cgi/SDL_AddTimer) Wie schaffe ich das? Bei meine bisherigen Versuche habe ich immer nur Compilerfehler bekommen.

    Klasse:

    class Timer {
    protected:
    	virtual Uint32 CallbackFunction( Uint32 interval, void* param ) = 0;
    public:
    	bool Add( Uint32 interval );
    };
    

    Funktion:

    bool Timer::Add( Uint32 interval ) {
    	if( !IsAdded() ) {
    		m_ID = SDL_AddTimer( interval, Timer::CallbackFunction, NULL );
    	}
    	return IsAdded();
    }
    

    Compiler-Fehler g++:

    error: argument of type ‘Uint32 (SDL::Timer::)(Uint32, void*)’ does not match ‘Uint32 ()(Uint32, void)’

    Hätte jemand einen Vorschlag?

    Vielen Dank im Voraus,
    TiBo



  • Der C-Callback kennt keine Memberfunktionszeiger, sondern nur Funktionszeiger auf globale Funktionen. Du musst daher eine freie Zwischenfunktion einrichten. Ist mühsam, aber das Problem hat man eben mit C-Bibliotheken.

    Übrigens gibt es schon einen Wrapper für SDL, nämlich SDLmm. Allerdings würde ich dir raten, wenn schon SFML zu verwenden (eine schöne C++-Bibliothek). Die hat auch eine saubere Timer-Klasse. 😉



  • SDLmm habe ich schon gefunden, allerdings fand ich in gewissen Bereichen nur Init und Quit Funktionen (Weswegen ich auch selber angefangen hab einen Wrapper zu schreiben).
    Weißt du ob SFML auf den selben Plattformen wie SDL verfügbar ist und die selben Funktionalitäten zur Verfügung stellt? (Ich weiß, ist off-topic ;))



  • TiBo schrieb:

    Weißt du ob SFML auf den selben Plattformen wie SDL verfügbar ist und die selben Funktionalitäten zur Verfügung stellt?

    Funktionalität sollte mehr oder weniger die gleiche sein. Allerings fand ich bei SFML praktisch, dass man nicht für jede Kleinigkeit (z.B. JPEG-Bilder, TTF-Schriftarten, Sound, Zoom und Rotation) ein eigenes Modul herunterladen muss. Auch das API finde ich viel sauberer (allein schon da es in C++ geschrieben ist). Und bezüglich Performance schneidet SFML ebenfalls besser ab. Ich habe früher auch SDL verwendet, allerdings bin ich vor etwa zwei Jahren umgestiegen.

    Plattformen werden von SFML weniger unterstützt, die verbreitetsten für Desktopanwendungen und Spiele (Windows, Mac und Linux) sind jedoch dabei.


Log in to reply