Spielt es eine Rolle, wo Forward Declaration gemacht wird?



  • Sagen wir ich habe eine Klasse

    namespace NS {
    Class1 { };
    }
    

    und auf die will ich im Header Bar eine Forward Declaration (FD) anlegen:

    // Bar.h
    
    namespace NS {
    
    namespace NS2 {
    
    class Bar {
       Class1* c;
    };
    
    }
    
    }
    

    Wo muss ich jetzt die FD hinschreiben? Innerhalb von NS (aber nicht in NS2)? Oder global? Oder ist es egal? Und muss ich dann eigentlich NS::Class1 c; in Bar schreiben oder reicht Class1?



  • mooper schrieb:

    Wo muss ich jetzt die FD hinschreiben? Innerhalb von NS (aber nicht in NS2)? Oder global?

    Dort wo Class1 später definiert wird.

    mooper schrieb:

    Und muss ich dann eigentlich NS::Class1 c; in Bar schreiben oder reicht Class1?

    Wenn Bar irgendwo innerhalb von NS oder einem untergeordneten Namespace ist, dann reicht das eigentlich. Der Compiler sucht dann in den übergeordneten Namespaces. Aber Vorsicht:

    //n1n2_class1.h
    namespace N1 {
    namespace N2 {
      class Class1 {};  //N1::N2::Class1
    }}
    
    //n1_class1.h
    namespace N1 {
      class Class1 {}; //N1::Class1
    }
    
    //n1n2_bar.h
    #include "n1_class1.h"
    namespace N1 {
    namespace N2 {  
      class Bar
      {
        Class1* p1;
      };
    }}
    
    //A.cpp
    #include n1n2_bar.h //Bar benutzt N1::Class1
    #include n1n2_class1.h
    
    //B.cpp
    #include n1n2_class1.h
    #include n1n2_bar.h //Oops! Bar benutzt N1::N2::Class1
    

    Das Problem daran ist, dass erst die #includes ausgeführt werden und danach erst die Namen aufgelöst werden. In der Übersetzungseinheit von A ist zum Zeitpunkt der Bar-Definition nur N1::class1 bekannt. in B ist auch N1::N2::class1 bekannt, und die hat Vorrang!


Anmelden zum Antworten