将枚举放在cpp程序中的哪个位置?

时间:2009-06-14 19:05:44

标签: c++

我有一个使用枚举类型的程序。

enum Type{a,b,};


class A
{
 //use Type
};
class B
{
  // also use that Type
};

2类位于2个不同的文件中。 我应该将类型定义放在头文件中还是 在每个类的类定义中?

5 个答案:

答案 0 :(得分:42)

如果要在多个.cpp文件中使用枚举,则应将其放在每个都包含的头文件中。如果有一个公共头文件,你应该使用它,否则你也可以为这个枚举创建一个新的头文件

答案 1 :(得分:6)

您应该总是尝试在C ++中限制类型的范围,因此枚举应该在类范围内声明。枚举通常在一个类中比另一个更自然地属于 - 让我们说A类,所以你把它放在a.h头中的A声明中:

// a.h

class A {
    public:
       enum Type { a, b };
    ...
};

现在你需要在声明B:

的标题中包含a.h.
// b.h
#include "a.h"

class B {
   public:
      void f( A::Type t );     // use the Type enum
   ...
};

答案 2 :(得分:2)

我可以看到Neil的观点:对于许多程序员来说,看到全球范围内的东西是一件令人讨厌的事情。 otoh,imho,为enum引入一个类并不是一个好的风格:它应该是enum而不是一个类。但是,在两个类中放置相同的枚举列表(正如您所要求的)将是最糟糕的想法:我们不想重复这些内容。

此外,在大多数非平凡的代码中,最终可能会使用更多此类共享实体(更多枚举,const参数等)来实现。所以,我开始将所有这些都集中到一个实现命名空间(比如“detail”),它是类的子命名空间,并且位于一个单独的头文件(比如“detail.hpp”)中,包含在所有人中。例如:

// file A.hpp 
#include "foo/detail.hpp"
namespace foo {
   class A 
   { 
   // accessing enum as detail::a 
   };
}

// file B.hpp
#include "foo/detail.hpp"
namespace foo { class B { ... }; }  

// file foo/detail.hpp
namespace foo { namespace detail {
   enum { a,b, ... }
   const int three = 3;
   // etc...
   // other implementation classes etc...
}}

并且“细节”是一种很好而且干净的方式来警告你的班级用户退出那里声明的内容。随着代码变得越来越大,这些实现细节的数量开始增长,您可以将依赖关系分解为单独的头文件(detail1 detail2等...),并且仍然保留一个“详细”命名空间(您无法使用“类详细信息” “ 例如)。

答案 3 :(得分:1)

问题相当模糊,但根据经验,您应该尽量减少代码中的冗余。因此,您应该将枚举的声明放在头文件中。

答案 4 :(得分:0)

这实际上取决于值是否是相同的逻辑类型,或者它们恰好具有相同的名称。将A :: Type变量赋给C :: Type是否有意义?如果它们是相同的逻辑类型,请将它们放在两个包含的标头中。为了保持较低的构建时间,您可能希望将其放在自己的头文件中,但如果要保持文件数量不变,则将其放在带有其他内容的共享头中。

另一种选择是将枚举放在一个公共基类中,它们都继承自(在这种情况下这可能没有意义,但它是另一种选择)。