在嵌套名称空间范围中使用名称空间的正确方法
Correct way to using namespace in nested namespace scope
我们在代码中具有一个通用名称空间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);
};
}
}
更好的方法是声明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();
}
}
相关文章:
- 如何通过命名空间调用非静态方法
- 转发声明在命名空间中不起作用的替代方法
- 使用 GMock 的具有命名空间的模拟方法
- 在方法定义中显式指定命名空间
- 使用类指针重载C++命名空间函数模板专用化替代方法?
- C++详细介绍命名空间 vs 匿名 vs 私有方法到类 vs. pimpl vs. 朋友类
- 有什么方法可以"factor out"公共字段以节省空间?
- 请告诉我在巴泽尔拥有多平台工作空间的更好方法
- 是否有一个很好的方法可以在C 11中打印出像JSON一样的Trie结构(仅迭代解决方案)的扁平命名空间
- 是否有一种方法可以避免标头文件中使用的constexpr函数输入全局范围,而无需额外的名称空间
- 声明方法时没有名称空间,也没有对C 作用的方法的对象
- 从类方法调用命名空间中名为 Same 的函数时,重载解析失败
- 在嵌套名称空间范围中使用名称空间的正确方法
- 此插入方法的时间和空间复杂性
- 为在与类方法中的类相同的命名空间中定义的结构调用重载运算符
- 有没有一种方法可以创建具有广义属性的命名空间
- 有什么方法可以将此功能分开并插入空间
- 在某些名称空间中定义方法时,在全局名称空间中声明
- Singleton实现:与Singleton类相比,名称空间方法通常更可取吗
- 当类方法不进行时,为什么从标头文件中的独立方法需要为命名空间资格