小编Tho*_* G.的帖子

如何克服C++头文件的命名空间邪恶?

通过我的一个项目,我将进入C++领域.基本上我来自Java背景,并想知道如何在C++世界中实现Java包的概念.这使我了解了名称空间的C++概念.

到目前为止,我对命名空间绝对不错,但是当涉及到头文件时,就完全限定的类名,using-directives和using-declarations来说,事情变得有点低效.

这个问题的一个很好的说明是文章由Herb萨特.

据我所知,这一切归结为:如果您编写头文件,请始终使用完全限定的类型名称来引用其他名称空间中的类型.

这几乎是不可接受的.由于C++标头通常提供类的声明,因此最大可读性具有最高优先级.完全有资格从不同的命名空间每种类型产生大量视觉噪声的,最终削弱了头的可读性,其程度提出了一个问题,即是否在所有使用的命名空间.

不过我想利用C++命名空间,所以想一想:如何克服C++头文件的命名空间邪恶?经过一些研究,我认为typedef可能是解决这个问题的有效方法.

下面你将找到一个C++示例程序,它演示了我如何使用公共类作用域typedef从其他名称空间导入类型.该程序在语法上是正确的,并在MinGW W64上编译良好.到目前为止一切都那么好,但我不确定这种方法是否能乐于从标题中删除using关键字,但会引入另一个我根本不知道的问题.就像Herb Sutter描述的东西一样棘手.

那就是我恳请所有对C++有深入了解的人来审查下面的代码,让我知道这是否有效.谢谢你的想法.

MyFirstClass.hpp

#ifndef MYFIRSTCLASS_HPP_
#define MYFIRSTCLASS_HPP_

namespace com {
namespace company {
namespace package1 {

class MyFirstClass
{
public:
    MyFirstClass();
    ~MyFirstClass();

private:

};

} // namespace package1
} // namespace company
} // namespace com

#endif /* MYFIRSTCLASS_HPP_ */
Run Code Online (Sandbox Code Playgroud)

MyFirstClass.cpp

#include "MyFirstClass.hpp"

using com::company::package1::MyFirstClass;

MyFirstClass::MyFirstClass()
{
}

MyFirstClass::~MyFirstClass()
{
}
Run Code Online (Sandbox Code Playgroud)

MySecondClass.hpp

#ifndef MYSECONDCLASS_HPP_
#define MYSECONDCLASS_HPP_

#include <string>
#include "MyFirstClass.hpp"

namespace com {
namespace company {
namespace package2 {

    /* …
Run Code Online (Sandbox Code Playgroud)

c++ typedef namespaces using header

6
推荐指数
1
解决办法
7985
查看次数

标签 统计

c++ ×1

header ×1

namespaces ×1

typedef ×1

using ×1