Zwei Klassen untereinander bekannt machen. (prototypes)



  • Ich besitze folgende zwei Klassen:
    - class Net_c
    - class MainWindow : public Gtk::Window (gtkmm)

    Im ersten Schritt würde ich beide gerne untereinander bekannt machen das man sowohl von der einen, auch auf die andere zugreifen kann.

    Wenn ich folgenden Prototyp oben drüber schreibe:
    class MainWindow;

    und ich ein Objekt vom Typ MainWindow in Net_c erstelle bekomme ich folgende Compiler Meldung:
    win_m.h:43: error: field ‘a’ has incomplete type

    Danke für eure Hilfe(n) 😉



  • Erstelle Objekte der anderen Klasse erst in der .cpp-Datei, dort kannst du unbesorgt Header einbinden. Allerdings solltest du dich jedes Mal fragen, ob eine gegenseitige Abhängigkeit tatsächlich nötig und sinnvoll ist.



  • Die Lösung ist etwa 30 Minuten alt und steht im Moment 6 Beiträge weiter unten
    Guckst du hier



  • Schlüsselwort

    friend
    

    ?

    http://www.imb-jena.de/~gmueller/kurse/c_c++/c_friend.html

    /Edit: Vergesst was ich geschrieben habe, die Augen haben schneller gelesen und die Finger schneller getippt als der Verstand gearbeitet hat 😉


  • Mod

    Trenne Deklaration und Definition der Methoden! Deklarier erst alles (üblicherweise in einem Header) und danach erst definierst du die Methoden (üblicherweise in einer Source-Datei).

    RedPuma schrieb:

    Schlüsselwort

    friend
    

    ?

    Nein, dies hier ist ein anderes Problem als die Sichtbarkeit.



  • Zunächst einmal danke für die Zahlreichen antworten.
    Deklaration und Methoden sind voneinander getrennt.
    Ich habe meine Klasse wie folgt umgebaut:

    #include "net_c.h"
    class MainWindow : public Gtk::Window {
    // blabla
    }; // hierbei besteht kein Problem von dieser auf die net_c Klasse zuzugreifen
    

    Zweite Klasse (neue Header Datei)

    // class proto
    class MainWindow;
    
    class Net_c {
    // blabla
    public:
    void getptrMW(MainWindow*);
    
    };
    
    In der Net_c.cpp:
    void Net_c::getptrMW(MainWindow *ptr) {
    	ptr->set_status("Ja :-))");
    // Wie bekomme ich nun hin auf set_status zuzugreifen?
    }
    

    Folgender Compiler Fehler:
    net_c.cpp: In member function ‘void Net_c::getptrMW(MainWindow*)’:
    net_c.cpp:7: error: invalid use of incomplete type ‘struct MainWindow’
    net_c.h:30: error: forward declaration of ‘struct MainWindow’

    Danke 🙂


  • Mod

    Sind in der Net_c.cpp auch beide Header eingebunden?



  • SeppJ schrieb:

    Sind in der Net_c.cpp auch beide Header eingebunden?

    Vielen Dank das war der Fehler, ich könnte dich knutschen 😉



  • Eine Frage aus Interesse, wie wuerde man die Problemstellung mit drei Klassen realisieren. Besteht die Möglichkeit eine globale Header Datei zu erstellen bzw. ist das sinnvoll?


  • Mod

    essteeu schrieb:

    Eine Frage aus Interesse, wie wuerde man die Problemstellung mit drei Klassen realisieren. Besteht die Möglichkeit eine globale Header Datei zu erstellen bzw. ist das sinnvoll?

    Das kommt auf das Verhältnis der Klassen zueinander an.

    Globale Header kann man zwar erstellen, aber dies ist selten sinnvoll.


Log in to reply