Importazione di spazi dei nomi all'interno di un altro spazio dei nomi

6

In genere mi piace organizzare le classi che creo in moduli usando gli spazi dei nomi, e anche io non passo più di 2 spazi dei nomi in profondità, ma è ancora faticosamente difficile qualificare completamente tutto.

Ho pensato di utilizzare utilizzando le direttive, ma non voglio che alcune intestazioni inquinino altre intestazioni. Ad esempio:

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

Il "problema" qui è che posso vedere MyClass1 in MyHeader3.hpp nello spazio dei nomi MyModule2 se lo importiamo in MyHeader2.hpp . Posso vedere che questo non sarebbe un problema se le direttive using fossero permesse nell'ambito della classe.

La domanda è, c'è un modo migliore per farlo, dovrei semplicemente mettere a punto e qualificare pienamente tutto o dovrei evitare del tutto gli spazi dei nomi?

    
posta John Mark Caguicla 09.02.2016 - 16:55
fonte

1 risposta

7

No, dovresti definire non spazi dei nomi abusivi! Invece, dovresti organizzare meglio il tuo codice e forse ricontrollare la tua architettura.

Per prima cosa, non dovresti usare using namespace MyLibrary::MyModule1; o using MyLibrary::MyModule1::MyClass1; in un'intestazione, per evitare la polution dello spazio dei nomi, poiché non c'è modo di annullarlo (vedi questa domanda e risposte ).

Un'altra opzione è usare typedef:

namespace MyLibrary {
    namespace MyModule2 {

        class MyClass2 {
        public:

            typedef MyLibrary::MyModule1::MyClass1 FunctionArg;

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

E se usi c ++ 11 e versioni successive, puoi usare using in un altro modo:

namespace MyLibrary {
    namespace MyModule2 {

        class MyClass2 {
        public:

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

Leggi altre domande sui tag