Probleme mit Namensräumen



  • Ich glaube es ist ein ähnliches Problem, wie meine frühere Frage zu sich gegenseitig referenzierenden Objekten.

    Als Beispiel:

    Es gibt einen Namensraum A der Objekte aus dem Namensraum B benutzt und B benutzt welche aus A.

    'header anything.h
    #ifndef anything_h
    #define anything_h
    #include "something.h"
    
    namespace A
    {
      class Anything
      {
       Anything() {}; 
       B::Something s;
      }
    }
    #endif
    
    'header something.h
    #ifndef something_h
    #define something_h
    #include "anything.h"
    
    namespace B
    {
      class Something
     {
       Something() {};
       void func(A::Anything* a) { ... };
     }
    }
    
    #endif
    

    Ok. Wenn ich jetzt in class something einfüge "class Anything" dann läuft alles, so lange wie ich nicht versuche "something.h" in einer dritten Datei einzubinden.
    Dann bekomme ich die Fehlermeldung, dass es den Namensraum B nicht gibt.



  • Du bindest die Header gegenseitig ein, und das geht nicht, wenn du beide dann in einer dritten Datei inkludierst.
    Anstatt die Header einzubinden, benutze einfach Vorwärtsdeklarationen (forward declarations), z.B.

    anything.h:

    #ifndef anything_h
    #define anything_h
    
    #include "something.h"
    
    namespace A
    {
      class Anything
      {
       Anything() {}; 
       B::Something s;
      }
    }
    #endif
    

    something.h:

    #ifndef something_h
    #define something_h
    
    namespace A
    {
       class Anything;  // <-- hier die Deklaration!!
    };
    
    namespace B
    {
      class Something
     {
       Something() {};
       void func(A::Anything* a) { ... };
     }
    }
    
    #endif
    

    Dies geht natürlich nur bei Zeigern und Referenzen. Sobald ganze Klassen benötigt werden, kommt man um die includes nicht herum.
    Ansonsten müßtest du die Deklarationen doch zusammen in eine Datei bringen.

    Gegenseitige Abhängigkeiten über Namensräume sollten aber sowieso vermieden werden (plane deine Projekte möglichst immer hierarchisch, d.h. ohne zyklische Loops).


Anmelden zum Antworten