如何减轻类声明远离文件中的所有者名称空间声明?

时间:2009-12-01 18:05:39

标签: c++ naming-conventions namespaces declaration prefix

所以,我已经看到命名空间可以将声明组织到各自的组中,但现在出现了问题。

在C语言中创建库和在C ++中创建库之间的区别在于你必须在声明前面添加它们所属的内容,例如我们要复制的库MyMath可能有一个矢量类,这个名字可能是MM_Vector。

在C ++中,您将拥有一个命名空间MyMath,并将Vector类声明为其一部分。

现在这里的区别在于C,只需进入类声明,您就会立即知道如何使用它。在C ++中,您必须检查特定类所属的命名空间(实际上只是声明不在命名空间声明附近的文件中的问题,如果在两者之间声明了常量和枚举,这可能很常见)。虽然我更喜欢使用命名空间进行组织,但在我看来,这仍然是一个有效的争论。

人们为减轻这种烦恼做了什么?

5 个答案:

答案 0 :(得分:2)

使用提供快速提示和符号导航的IDE和/或使用文档生成器(例如Doxygen)。

答案 1 :(得分:2)

“在声明不在​​命名空间声明附近的文件中只有一个问题,如果在两者之间声明了常量和枚举,这可能很常见。”

如果这困扰你,请执行以下操作:

namespace MyMath {
    constants and enumerations go here
}

namespace MyMath {
    class goes here
}

namespace MyMath {
    another class goes here
}

与类不同,您不必一起定义命名空间。括号并不意味着“这就是所有东西”,它们只是表示所有定义都在该命名空间中的范围,并且所有符号都在命名空间中查找。

答案 2 :(得分:2)

his book的第8章中,Stroustrup建议使用如下样式:

MyMath.h

namespace MyMath {
  class Vector;
};

<强> Vector.h

#include "MyMath.h"

class MyMath::Vector {
  public:
  Vector();
  // ...
};

<强> Vector.cc

#include "Vector.h"

MyMath::Vector::Vector() { /* ... */ }

将开放的名称空间声明限制为其内容的声明会产生简短的摘要。完全限定的定义允许编译器捕获拼写错误。

应用于您的关注点时,此样式中的类声明和定义使每个类的父命名空间变得清晰 - 以Go人称之为stuttering为代价。

答案 3 :(得分:0)

应该没有问题。只需确保任何标头中都没有using语句,并且没有单片源文件。如果这是一个大问题,请完全符合您的课程资格。

答案 4 :(得分:0)

您描述的问题归结为您所处的心态。在开发代码时,您知道您正在使用MyMath::Vector,所以您有兴趣看到尽可能少的混乱,并添加using namespace MyMath;using MyMath::Vector;子句。

几个月之后,有人会进入您的代码,而不会知道Vector来自哪个命名空间。他可能会争辩(正如你所做的)这个using声明会使代码变得不易理解。

这就是优秀IDE的用武之地:您可以将命名空间(对于大型系统来说可能变得非常大),但在调试/编辑代码时,IDE可以完美地暗示符号所在的位置声明,定义,引用等...