Zyklus auflösen



  • Hallo

    ich habe ein kleines C++ Problem mit einer Art zyklischen Abhängigkeit. Folgendes (vereinfachtes) Beispiel beschreibt das Problem:

    // A.h
    #include "B.h"
    
    class A {
    public:
       enum Foo { ... };
       B* b;
    };
    
    // B.h
    #include "A.h"
    class B {
    public:
       B(const A::Foo foo);
    };
    

    Ferner gibt es wie üblich eine A.cpp und B.cpp, wobei A.cpp den Header A.h und B.cpp den Header B.h inkludiert.

    In A.h inkludiere ich B.h, da ich in A einen Zeiger auf B habe. In B.h inkludiere ich A.h, da ich den Typ A::Foo in B brauche. Nur leider kompiliert das jetzt nicht - wenn z.B. A.cpp übersetzt wird, dann wird A.h inkludiert und daraufhin B.h und dann wird der Compiler in der Klassendeklaration B auf A::Foo stoßen, wobei er allerdings A::Foo noch nicht kennt => Fehler.

    Eigentlich braucht nur die Klasse A die Klasse B. Also eigentlich wäre es nur notwendig, dass A.h "B.h" inkludiert und "B.h" sollte _nicht_ "A.h" inkludieren.

    Ich möchte gerne das enum Foo in A lassen. Wie kann man das lösen? Danke!



  • Kannst du das enum aus A nicht auslagern?



  • Naja, wie gesagt ich hätte es gerne in A gehabt. Aber ich glaube es bleibt mir wohl nix anderes übrig als es aus A zu entfernen und in B.h zu definieren.



  • Wie wäre es mit forward declaration?

    // A.h
    //kein include
    
    class B; //forward declaration, da du ja nur einen Zeiger hast
    
    class A {
    public:
       enum Foo { ... };
       B* b;
    };
    

Log in to reply