Klassenmethode via Zeiger aufrufen



  • Danke für die schnelle Antwort.
    Genau das wollte ich eigtl. nicht. Die 2.Klasse stellt einen Player dar.
    Dieser soll komplett eigenständig laufen. Die 1. Klasse stellt die GUI dar.
    Die Player Klasse soll portierbar sein ohne Anpassungen. Das mit dem this übergeben funktioniert deshalb nicht. Ich wollte so was wie eine CALLBACK aber
    für Klassen. Ich möchte eine Wave Ausgabe via Grafik erstellen die in der 1. Klasse statt findet. Aber die Player Klasse soll auch ohne auskommen.

    MfG AndOne



  • Muß der Player denn die GUI-Klasse kennen? Wenn nicht, reicht es aus, daß die GUI ein Player-Objekt hält und ihn über Methoden-Aufrufe steuert.



  • Du kannst die GUI-Klasse wegabstrahieren.

    Die Java-Variante (abstraktes Interface):

    class Observer
    {
        public:
            virtual ~Observer();
            virtual void Notify(int i) = 0;
    };
    
    class Gui : public Observer
    {
        public:
            virtual void Notify(int i);
    };
    
    class Player
    {
        public:
            Player(Observer& obs) : obs(obs) {}
            void DoSomething() { obs.Notify(37); }
        private:
            Observer& obs;
    };
    
    Gui g;
    Player p(g);
    p.DoSomething();
    

    Die C++-Variante (Funktionsobjekt):

    class Gui
    {
        public:
            void Notify(int i);
    };
    
    class Player
    {
        public:
            Player(std::function<void(int)> callback) : callback(callback) {}
            void DoSomething() { callback(37); }
        private:
            std::function<void(int)> callback;
    };
    
    Gui g;
    Player p(std::bind(&Gui::Notify, &g, _1));
    


  • So etwas lässt sich mit boost bind und function lösen.



  • Der Player soll die GUI nicht kennen.
    Die GUI hat aber ein Objekt der Playerklasse und kann diese steuern, eigtl. Logisch. Nur würde ich gerne dem Player eine Funktion der GUI übergeben die
    aus dem Soundpuffer ein Wave zeichnet. Der Player dudelt ja so vor sich hin
    und immer wenn der Soundpuffer "refresht" wird soll die "GUI Zeichen" Funktion
    angesprungen werden. Ich hoffe ihr versteht was ich meine. Oder habt ihr andere Ideen wie man so was machen könnte.

    Mfg AndONe



  • @Nexus Das mit "wegabstrahieren" sieht nach dem aus was ich suche. ich werde es mal damit versuchen. Meld mich dann wieder.
    Erstmal vielen Dank für den Tip.

    MfG Thorsten



  • Kann das sein das nicht jeder Compiler std::function kennt ?

    #include <functional>
    #include <iostream>
    using namespace std;
    
    std::function<void(int)> callback;
    

    Fehlermeldung von MinGW 4.4:

    playerclass.h:23: error: ISO C++ forbids declaration of 'function' with no type
    playerclass.h:23: error: invalid use of '::'
    playerclass.h:23: error: expected ';' before '<' token

    Naja, morgen gehts weiter ... Nachti
    Bestimmt hat noch einer von den Nachschwärmern ne Iddee 😉

    MfG AndOne



  • Kann durchaus sein, std::function ist afaik neu in C++0x, das ist noch nicht einmal offiziell verabschiedet.



  • Mit -std=c++0x versuchen, oder std::tr1::function oder boost::function verwenden. Für die zweite Möglichkeit brauchst du den Header <tr1/functional> und für die dritte die Boost-Bibliothek.



  • Hab das mal kurz auf Arbeit mit "tr1" getestet. Nun Compiliert er es, alles andere
    probiere ich heute Abend zu Hause aus. Ich dank euch erst mal.

    MfG Thorsten



  • Danke euch allen für die Hilfe, nun klappt das so wie ich mir das vorgestellt
    habe. Hier ein Link zu einem Video wo man sieht um was es ging.

    http://youtu.be/CGiZ9mxJnVs

    MfG AndOne


Anmelden zum Antworten