在嵌套命名空间范围中使用命名空间的正确方法

时间:2018-02-19 09:59:30

标签: c++ namespaces

我们在代码中有一个公共名称空间MainNamespace,每个模块有很多名称空间,例如。 ModuleNamespaceDifferentModuleNamespace。模块命名空间位于主命名空间内。

当我们创建一个新类并需要来自不同模块的另一个类时,我们必须声明一些使用以避免编写完整的命名空间路径。

在这种情况下,什么是好的做法:

使用完整路径的命名空间:

namespace MainNamespace {
namespace ModuleNamespace {

using MainNamespace::DifferentModuleNamespace::Foo;

       class MyClass {
           void method(Foo);
       };
}
}

或从路径中删除MainNamespace命名空间:

namespace MainNamespace {
namespace ModuleNamespace {

using DifferentModuleNamespace::Foo;

   class MyClass {
       void method(Foo);
   };
}
}

或者可能不同的方法更好?

编辑:

好的,也许是另一个问题。使用名称空间(using A = Main::ModuleA::A;)的绝对路径比使用短路径(using A = ModuleA::C;)更安全。当我们在同一个主命名空间中执行它时。

文件A.h:

namespace Main 
{
    namespace ModuleA {
        class A
        {
        public:
            A();
            ~A();
        };

        class C
        {
        public:
            C();
            ~C();
        };
    }
}

文件B.h:

  #include "A.h"

    namespace Main {
        namespace ModuleB {

            class B
            {
                using A = Main::ModuleA::A;
                using A = ModuleA::C;

            public:
                B();
                ~B();
                void foo(A a);
                void bar(C c);
            };
        }
    }

2 个答案:

答案 0 :(得分:2)

更好的方法是为Foo声明类级别别名,并从命名空间范围中删除using声明。当ModuleNamespace中的其他类决定从其他位置使用Foo时,这有助于防止名称冲突。

class MyClass {
   using Foo = DifferentModuleNamespace::Foo;
   void method(Foo);
};

或者,如果Foo应该在ModuleNamespace内部的其他各个位置使用,则值得创建名称空间范围类型别名(可能驻留在单独的头文件中) :

// MainNamespace/ModuleNamespace/Foo.hpp
namespace MainNamespace {
namespace ModuleNamespace {

using Foo = DifferentModuleNamespace::Foo;

}
}

#include <MainNamespace/ModuleNamespace/Foo.hpp>

namespace MainNamespace {
namespace ModuleNamespace {

class MyClass {
     void method(Foo);
};

}
}

答案 1 :(得分:0)

1)避免声明'使用命名空间'以避免冲突(例如,这里的init()会发生冲突)。虽然类成员函数不会受到名称冲突的影响,但是公共帮助函数可以。类似命名的辅助函数可以轻松地将继承的对象加载到一起,例如在工厂设计模式中,在这种情况下命名空间将成为必需的。

2)避免使用隐含的后缀命名空间。

3)为了清晰起见使用命名空间并避免冲突(例如core :: module :: create_factory()使其清晰)

namespace core{
namespace module1 {

       class MyClass1 {
           void method(Foo)
              {
                 module2::init();
              }
       };
   //HelperFunction
     void init();

}
}


namespace core{
namespace module2{

   class MyClass2 {
          void method(Foo)
              {
                 module1::init();
              }
   };
     //HelperFunction
     void init();
}
}
相关问题