[SOLVED]SDL_Thread mit Memberfunktionen



  • Morgen,

    ich würde SDL_Thread gern innerhalb einer Klasse mit Memberfunktionen verwenden. Leider scheitert dies an der Typumwandlung.

    Beispiel:

    #include "SDL/SDL_thread.h"
    
    class Threaded
    {
        int member_func() { return 0; }
        SDL_Thread* thread = nullptr;
    
        public:
            void operator()()
            {
                thread = SDL_CreateThread(member_func,nullptr);
            }
    } example;
    
    int main()
    {
        example();
    
        return 0;
    }
    

    Der Compiler gibt mir dabei folgende Fehlermeldung aus:

    main.cpp: In Elementfunktion »void Threaded::operator()()«:
    main.cpp:12:58: Fehler: »Threaded::member_func« kann nicht vom Typ »int (Threaded::)()« in den Typ »int (*)(void*)« umgewandelt werden
    

    Welche Möglichkeiten gibt es, diesen Fehler zu umgehen?

    Mit freundlichen Grüßen,
    Ki

    EDIT:
    Ich habe mittlerweile erfahren, dass nur statische Member Funktionen in dieser Form gecastet werden können. Die Lösung ist also Folgende:

    #include "SDL/SDL_thread.h"
    
    class Threaded
    {
        int member_func() { return 0; }
        static int static_member_func(Threaded* t) { return t->member_func(); }
        SDL_Thread* thread = nullptr;
    
        public:
            void operator()()
            {
                thread = SDL_CreateThread((int(*)(void*))static_member_func,this);
            }
    } example;
    
    int main()
    {
        example();
    
        return 0;
    }
    


  • Deine Lösung mag zwar funktionieren, ist aber falsch und erzeugt undefiniertes Verhalten. (Lies: Es kann schiefgehen, muss aber nicht.)

    Richtig wäre, wenn die Funktion einen void* nimmt und diesen in ein Threaded* castet:

    static int static_member_func(void* t) { return static_cast<Threaded*>(t)->member_func(); }
    


  • Danke, wird geändert.


Anmelden zum Antworten