Klassenmethode via Zeiger aufrufen



  • Hallo Leute,

    ich habe folgendes Problem.

    Und zwar erzeugt eine 1.Klasse eine neue 2.Klasse die SDL verwendet.
    Die 2. Klasse besitzt eine AudioFill Routine die Ständig von SDL aufgerufen
    wird. Nun möchte ich in der AudioFill Routine der 2.Klasse über einen Zeiger eine Methode aus der 1.Klasse aufrufen. Ich hoffe ihr versteht was ich meine und könnt mir helfen. Die 2. Klasse soll auch nichts von der 1.Klasse sehen also via #include oder so.

    MfG AndOne



  • AndOne schrieb:

    Die 2. Klasse soll auch nichts von der 1.Klasse sehen also via #include oder so.

    Wenn du Methoden der 1. Klasse aufrufen willst, muss ihre Definition sichtbar sein, folglich musst du ihren Header inkludieren. Du kannst ihn aber erst in der .cpp-Datei einbinden. (Es sei denn du legst eine Abstraktionsschicht dazwischen, z.B. abstrakte Basisklasse oder Callback, aber das nur am Rande).

    Übergib doch bei der Konstruktion des 2.-Klasse-Objekts einen Zeiger auf das Objekt der 1. Klasse.



  • 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


Log in to reply