2017-12-02 3 views
0

Ich entwickle gerade eine kleine Anwendungsklasse. Es soll bestimmte Schritte bei der Verwendung von SDL2 weniger schmerzhaft machen. Zum einen möchte ich, dass eine Funktion namens handleEvent beim Implementieren der abgeleiteten Klasse (die Anwendungsklasse ist eine Basisschnittstelle) überladen wird, um das aktuelle SDL_Event automatisch zu übergeben, damit der Benutzer damit arbeiten kann.Wird SDL eine reine virtuelle Memberfunktion als Ereignisrückruf aufrufen?

Ich dachte, dass die Verwendung der integrierten SDL-Funktion SDL_AddEventWatch, um einen Rückruf zu erstellen, besser wäre, als einen Thread zu starten und es manuell nach neuen Ereignissen suchen und die Mitgliedsfunktion aufrufen.

Die SDL Documentation for the function spezifiziert jedoch nicht die Verwendung einer Elementfunktion als "Filter". Und ich benutze sogar eine reine virtuelle Mitgliedsfunktion!

Bitte beachten Sie, dass der einzige Parameter, den diese Funktion benötigt (aus meiner Sicht), ein Zeiger auf die gerade zu verarbeitenden Even ist. Auf diesen This-Zeiger muss jedoch immer noch zugegriffen werden, so dass der Benutzer einfach Dinge in der Klasse direkt ändern kann.

Was ist die richtige Methode, dies zu implementieren?

+2

Wo ist Ihr Code? – Phil1970

+0

Kann das Problem ohne den Code nicht sehen. Schreiben Sie eine Funktion, die Ihre Callback-Objekte durchläuft und aufruft, wie Sie möchten, und legen Sie sie als SDL-Ereignis-Callback fest. Beachten Sie, dass sich die Ereigniswarteschlange nicht selbst füllt und Sie immer noch 'SDL_PumpEvents' aufrufen müssen. – keltar

Antwort

1

Ich würde die Verschlüsse von libffi verwenden, um einen Wrapper um die Instanz zu erstellen, der der erwarteten Signatur entspricht. Die Funktion, die zum Initialisieren der Closure verwendet wird, würde diesen gespeicherten Instanzparameter und jedes SDL übergeben und in die virtuelle Funktion weiterleiten.

+0

Ich habe diese Antwort nicht pro sagend verwendet, da in meinem speziellen Fall eine sehr spezifische Lösung einfacher war, jedoch habe ich das versucht und es funktioniert auch. – MoustacheSpy

Verwandte Themen