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

Correct way to using namespace in nested namespace scope

本文关键字:空间 方法 嵌套 范围      更新时间:2023-10-16

我们在代码中具有一个通用名称空间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);
            };
        }
    }

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

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

另外,如果应该在ModuleNamespace内部的其他位置使用Foo,则值得制作命名空间 - 距离类型类型别名(可能位于单独的标头文件中(:

// 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(避免使用命名空间'声明'来避免冲突(例如,init((此处会发生冲突(。尽管班级成员功能不会遭受名称冲突的困扰,但是公共助手功能可以。在将继承的对象加载在一起时,类似的命名辅助功能可以轻松使用,例如在工厂设计模式中,在这种情况下,名称空间将成为强制性。

2(避免使用后缀名称空间。

3(使用名称空间清晰并避免冲突(例如core ::模块:: 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();
}
}