我们在代码中有一个公共名称空间MainNamespace
,每个模块有很多名称空间,例如。 ModuleNamespace
,DifferentModuleNamespace
。模块命名空间位于主命名空间内。
当我们创建一个新类并需要来自不同模块的另一个类时,我们必须声明一些使用以避免编写完整的命名空间路径。
在这种情况下,什么是好的做法:
使用完整路径的命名空间:
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);
};
}
}
答案 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();
}
}