it-swarm.com.de

Namespaces in einen anderen Namespace importieren

Im Allgemeinen mag ich es, Klassen, die ich zu Modulen mache, mithilfe von Namespaces zu organisieren, und ich gehe auch nicht mehr als 2 Namespaces tief, aber es ist immer noch mühsam, alles vollständig zu qualifizieren.

Ich habe darüber nachgedacht, sing Direktiven zu verwenden, aber ich möchte nicht, dass einige Header andere Header verschmutzen. Zum Beispiel:

MyHeader1.hpp

namespace MyLibrary {
    namespace MyModule1 {
        class MyClass1 {
            // stuff
        };
    } // namespace MyModule1
} // namespace MyLibrary

MyHeader2.hpp

namespace MyLibrary {
    namespace MyModule2 {
        // I can import stuff
        // using namespace MyLibrary::MyModule1;
        // using MyLibrary::MyModule1::MyClass1;

        class MyClass2 {
        public:
            void DoSomething(MyLibrary::MyModule1::MyClass1 parameter); // I could do this
            void DoSomething(MyClass1 parameter); // or this (easier)
        };
    } // namespace MyModule2
} // namespace MyLibrary

MyHeader3.hpp

#include <MyModule2/MyHeader2.hpp>

namespace MyLibrary {
    namespace MyModule2 {
        // I understand that MyClass3 may use MyClass1 from here (the using directive would be beneficial), but what if it doesn't; it's left hanging in here import-ed
        // I can see MyLibrary::MyModule1::MyClass1 from here!

        class MyClass3 {
            MyClass2 some_var;
        };
    } // namespace MyModule 2
} // namespace MyLibrary

Das "Problem" hier ist, dass ich MyClass1 In MyHeader3.hpp Im MyModule2 - Namespace sehen kann, wenn ich es in MyHeader2.hpp Importiere. Ich kann sehen, dass dies kein Problem wäre, wenn sing Direktiven im Klassenbereich zulässig wären.

Die Frage ist, gibt es einen besseren Weg, dies zu tun, sollte ich einfach alles bemannen und voll qualifizieren oder sollte ich Namespaces ganz vermeiden?

8

Nein, Sie sollten auf keinen Fall zufällige Namespaces verwenden! Stattdessen sollten Sie Ihren Code besser organisieren und Ihre Architektur möglicherweise erneut überprüfen.

Erstens sollten Sie nicht using namespace MyLibrary::MyModule1; Oder using MyLibrary::MyModule1::MyClass1; In einem Header verwenden, um eine Verschmutzung des Namespaces zu vermeiden, da dies nicht rückgängig gemacht werden kann (siehe diese Frage und Antworten ). .

Eine andere Option ist die Verwendung von typedefs:

namespace MyLibrary {
    namespace MyModule2 {

        class MyClass2 {
        public:

            typedef MyLibrary::MyModule1::MyClass1 FunctionArg;

            void DoSomething(FunctionArg parameter);
        };
    } // namespace MyModule2
} // namespace MyLibrary

Und wenn Sie c ++ 11 und höher verwenden, können Sie using auf andere Weise verwenden:

namespace MyLibrary {
    namespace MyModule2 {

        class MyClass2 {
        public:

            using  FunctionArg=MyLibrary::MyModule1::MyClass1;
            void DoSomething(FunctionArg parameter);
        };
    } // namespace MyModule2
} // namespace MyLibrary
11
BЈовић