zyklische Abhängigkeiten von 2 headern



  • Hallo.
    Ich grüble zur Zeit über einem Problem:

    Ich habe 2 Klassen, wobei eine von der anderen abgelitten ist. In der abgelittenen Klassen-headerdatei befindet sich ein struct, auf welches ich aber schon in der Basisklasse Zugriff brauche.

    A.h

    #include <B.h>
    
    struct datentyp {
      int a;
      int b;
    };
    
    class A : public B{
    
    fx1() { //... }
    
    }
    

    B.h

    #include <A.h>
    
    class B {
    
    virtual fx1() = 0;
    
     calcB() {
        datentyp x;
     }
    }
    

    Ich kann jetzt das struct in die Basisklasses-headerdatei verschieben. Dieses soll aber aus verschiedenen Gründen möglichst unterblieben werden.
    Gibt es vielleicht eine andere Lösung, bei der das struct in dem headerfile der abgelittenen Klasse verbleiben kann?

    So wie es oben im schematischen Aufbau der Klassen zu sehen ist, habe ich versucht, dass beide Klassen jeweils sich gegenseitig #includen. Aber das geht ja bekanntlich nicht.... 😞



  • Pack die Implementierung von calcB() in ein .cpp File... 😉



  • struct datentyp {...} hat anscheinend nichts in A.h verloren.
    calcB() {...} in B.h wahrscheinlich auch nichts.

    Zyklische Abhängigkeit von Headern ist einfach falsch. Darf es nicht geben. Punkt. Fertig.



  • krümelkacker schrieb:

    Darf es nicht geben. Punkt. Fertig.

    Kann es auch nicht geben. Wenn sie auftritt ist es entweder falsche Aufteilung in Headers oder fehlende Forwärtsdeklarationen oder das Programm ist falsch (nicht im Sinne von unschönem Design sondern rein logisch falsch).



  • Hansi22 schrieb:

    Ich habe 2 Klassen, wobei eine von der anderen abgelitten ist.

    😮



  • A.h:

    #include <B.h>
    
    struct datentyp {
      int a;
      int b;
    };
    
    class A : public B{
    
    fx1() { //... }
    
    }
    

    B.h:

    class B {
    
    virtual fx1() = 0;
    
     void calcB();
    }
    

    B.cpp:

    #include <B.h>
    #include <A.h>
    
      void B::calcB() {
        datentyp x;
     }
    

    Oder noch besser ein <datentyp.h> anlegen mit nur dieser Struct. Dann hast Du nicht mehr gelitten.


Anmelden zum Antworten