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::Class1Das 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!