Kommunikation in beide Richtungen



  • hallo.

    ich würde gern eine Kommunikation zwischen meinen Klassen in beide Richtungen möglich machen. Ich hab mir da folgendes ausgedacht:
    Die Main Klasse ist die Kommunikationsschnittstelle zwischen den Klassen.

    class Main
    {
      private:
        Eins eins;
        Zwei zwei;
      public:
        Main(){};
        ~Main(){};
        AnsiString getText(){return eins.getText();};
        void druckeText(AnsiString text){zwei.druckeText(text);};
    };
    

    Klasse Eins und Zwei verwalten die Daten.

    class Eins
    {
      private:
        Main *parent;
        AnsiString text;
      public:
        Eins(Main *parent):parent(parent){};
        AnsiString getText(){return text;};
        void Aktualisieren(){parent->druckeText(text);};
    };
    
    class Zwei
    {
      private:
        Main *parent;
      public:
        Zwei(Main *parent):parent(parent){};
        void druckeText(String text);
        void Aktualisiere(){druckeText(parent->getText());};
    };
    

    Das hat wie vermutet nicht funktioniert 🙂
    Er kennt die Klasse Main nicht, trotz das ihr Headerfile included ist!
    Jetzt ist meine Frage kann man da was ändern um des zum laufen zu bekommen oder weiß einer von euch einen besseren Ansatz?
    Gruß KY



  • Ich schätze mal du hast bei Main.h eins.h und zwei.h inkludet und bei den anderen beiden dann jeweils main.h. Das kann wegen der Include-Guards nicht funktionieren. Am Besten ist es wohl du machst bei eins.h und bei zwei.h jeweils eine Forwarddeklaration für main.

    class main;
    

    Das inklude für die Main.h kommt dann in die cpp-Datei.



  • Hallo

    Das geht wenn du bei Eins und Zwei Forward Declarations benutzt

    // Main.h wie gewohnt
    #include "Eins.h"
    #include "Zwei.h"
    
    class Main
    {
      private:
        Eins eins;
        Zwei zwei;
      public:
        Main(){};
        ~Main(){};
        AnsiString getText(){return eins.getText();};
        void druckeText(AnsiString text){zwei.druckeText(text);};
    };
    
    // Header Eins.h
    // kein Include auf Main.h!
    
    class Main; // Forward Declaration
    
    class Eins
    {
      private:
        Main *parent;
        AnsiString text;
      public:
        Eins(Main *parent):parent(parent){};
        AnsiString getText(){return text;};
        void Aktualisieren(); // Implementation darf hier nicht in den header
    };
    
    // Eins.cpp
    #include "Main.h" // Erst hier Include
    
    void Eins::Aktualisieren()
    {
      parent->druckeText(text); // Hier kann parent benutzt werden
    }
    

    bis bald
    akari



  • cool 🙂
    des hab ich gesucht *freu*
    vielen dank!



  • eine frage hab ich noch dazu!
    ich mache jetzt alles wie oben beschrieben und des funktioniert wunderbar!
    jetzt habe ich in meiner "Main" Klasse eine Struktur (struct info{...}).
    wenn ich jetzt in den privaten berich von "Eins" folgendes ergänze:

    Main::Info info;
    

    Dann kommt die Meldung:

    [C++ Fehler] Eins.h(56): E2089 Bezeichner 'Info' darf keinen Typqualifizierer besitzen

    warum? und wie kann ich des ändern?
    Vielen Dank Gruß KY



  • Hallo

    Das geht nicht. Da du nun im Header von Eins nur eine Forward Declaration hast kannst du nicht im Header etwas anderes als einen Pointer auf Main verwenden. Der Compiler weiß nur das es eine solche Klasse gibt, aber nicht was die beeinhaltet. Auch nicht die Info-Klasse.

    Lösung ist die Info-Klasse aus der Main-Klasse rauszunehmen und in eine Extra Unit zu packen. Diese Unit kannst du nun sowohl von Main.h als auch von Eins.h inkluden.

    bis bald
    akari



  • ok danke 🙂


Anmelden zum Antworten