Member Function Zeiger Probleme^^



  • Hallo liebe Forengemeinde,

    ich stehe vor einem Problem, das zu hoch für mich ist:

    Ich möchte einen Thread mit einer Funtkionen erstellen, die in einer Klasse ist.
    Zur Verdeutlichung:

    //in meiner Hauptklasse
    boost::thread *my_Thread;
    
    //nun während der Laufzeit
    my_Thread=new boost::thread(SecondClass::my_func);
    

    Die Funktion my_func befindet sich in der Klasse SecondClass. Von dieser erzeuge ich auch per new-Befehl während der Laufzeit Objekte.
    Nun verstehe ich nicht ganz, wie ich den Thread mit der Funktion my_func aus SecondClass zum laufen kriege.

    Habe schon ein bissel gelesen, dass es evtl. was mit Funktionszeigern zu tun hat etc. Ist es denn besser die Funktion direkt aus der Klasse so wie oben zu holen oder nehme ich sie aus dem dynamisch erzeugten Objekt?
    Nur so nebenbei...
    Fehlermeldung beim obigen Code:
    error: invalid use of non-static member function void SecondeClass::my_func()'

    Hoffe ich habe es verständlich erklärt.
    Freue mich über jeden Rat und jede Erklärung 👍



  • Du kannst keine Funktion, die zu einem Objekt gehört, in einem eigenen Thread ausführen. Mach lieber eine statische Funktion, die das gleiche tut. (ich weiß ja nicht genau, was du machen willst.



  • Doch, doch das geht, aber nur über einen Umweg. Mit Hilfe von z.B. boost::bind kannst du die Memberfunktion an boost::thread übergeben. Sieh dir hierzu auch das Beispiel für Memberfunktionspointer an.



  • Hab mir jetzt boost::bind angesehen. Allerdings verstehe ich immernoch nicht, wie genau es nun benutzt wird. Das gegebene Beispiel zeigt bind für eine Funktion mit einem Parameter.Ich habe aber eine parameterlose Funktion mit void als Rückgabetyp.
    my_Thread=new boost::thread(boost::bind(&SecondClass::my_func));
    funktioniert also demzufolge nicht.
    Wie verwende ich das dann? Aus der Doku werde ich net schlau 😞



  • Tipp: boost::mem_fn und boost::bind behandeln einen Elementfunktionszeiger wie eine normale Funktionen, welche einen zusätzlichen Parameter bekommen, über den man sagen kann, auf welchem Objekt die Funktion aufgerufen wird. Siehe die 4 Beispiele aus der boost::bind-Doku, achte besonders auf den 2. Parameter.



  • my_Thread=new boost::thread(boost::bind(&SecondClass::my_func,this));
    

    Ein Zeiger auf die Klasse ist dabei implizit erster Parameter.



  • Klar geht das,
    wenn man den kompiler kennt.

    Ne ausführliche beschreibung findet ihr hier:
    http://www.c-plusplus.net/forum/278752
    grüüße



  • OK funktioniert so wie es dfdfgdfgdfg geschrieben hat^^
    Thx für die Hilfe 👍


Anmelden zum Antworten