Importando namespaces dentro de outro namespace

6

Eu geralmente gosto de organizar classes que eu faça em módulos usando namespaces, e eu também não tenho mais que 2 namespaces de profundidade, mas ainda é meticulosamente difícil qualificar tudo.

Eu pensei em usar usando diretivas, mas eu não quero alguns cabeçalhos poluindo outros cabeçalhos. Por exemplo:

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

O "problema" aqui é que eu posso ver MyClass1 in MyHeader3.hpp dentro do namespace MyModule2 se eu importá-lo dentro de MyHeader2.hpp . Eu posso ver que isso não seria um problema se as diretivas using fossem permitidas no escopo da classe.

A questão é, existe uma maneira melhor de fazer isso, devo apenas criar e qualificar completamente tudo ou devo evitar namespaces por completo?

    
por John Mark Caguicla 09.02.2016 / 16:55
fonte

1 resposta

7

Não, você definitivamente não deve namespace do abandom! Em vez disso, você deve organizar melhor seu código e talvez verificar sua arquitetura novamente.

Primeiro, você não deve usar using namespace MyLibrary::MyModule1; ou using MyLibrary::MyModule1::MyClass1; em um cabeçalho, para evitar a poluição do namespace, pois não há como desfazer isso (consulte esta questão e respostas ).

Outra opção é usar typedefs:

namespace MyLibrary {
    namespace MyModule2 {

        class MyClass2 {
        public:

            typedef MyLibrary::MyModule1::MyClass1 FunctionArg;

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

E se você usar o c ++ 11 e posterior, poderá usar using de outra maneira:

namespace MyLibrary {
    namespace MyModule2 {

        class MyClass2 {
        public:

            using  FunctionArg=MyLibrary::MyModule1::MyClass1;
            void DoSomething(FunctionArg parameter);
        };
    } // namespace MyModule2
} // namespace MyLibrary
    
por 09.02.2016 / 17:21
fonte