你应该在课堂内外声明枚举吗?

时间:2012-03-09 08:05:48

标签: c++ coding-style enums namespaces

如果所述枚举仅用于类成员函数中,是否应在类内部或外部声明枚举?

namespace nspace
{

// need to append OC, as this pollutes the current namespace
enum OUTSIDE_CLASS {OC_POINTS, OC_LINES, OC_LINE_LOOP, :::};
enum OTHER_ENUM {OE_POINTS};
class VertexBuffer
{
public:
    enum INSIDE_CLASS {POINTS, LINES, LINE_LOOP, :::};
    void foo(OUTSIDE_CLASS e);
    void bar(INSIDE_CLASS e);
}
};

// usage
nspace::VertexBuffer v;
v.foo(nspae::VB_POINTS);
v.bar(nspace::VertexBuffer::POINTS); // more pedantic

4 个答案:

答案 0 :(得分:14)

真正的目标是避免污染范围(全局或命名空间)并帮助将相关值组合在一起(在IDE中使用自动完成工作的漂亮商品)。

使用C ++ 11,您可以使用以下命令声明强类型枚举:

enum class MyEnum {
  Value0,
  Value1
};

必须以MyEnum::Value0(而不是Value0)调用。

在C ++ 03中,你可以或多或少地用以下方式模拟:

struct MyEnum {
  enum Type {
    Value0,
    Value1
  };
};

但是枚举的类型是MyEnum::Type,这是微妙的不同。

懒惰选项只是将它转储到一个类中,但我仍然喜欢嵌套一个范围的枚举,即使在一个类中,只是为了清楚地表明那些值不是松散而是相互关联的

答案 1 :(得分:7)

如果只有您的班级成员使用enum,则最好在班级内声明enum
这可以防止命名空间/全局空间因不需要的符号名称而受到污染。也
它对于班级用户来说更直观,它可以帮助用户知道enum只会被班级使用。

您应遵循的一般规则是:
不要在范围(全局/命名空间)中添加任何符号,该范围在该范围内不会被访问(并且因此不需要)。

答案 2 :(得分:0)

正如Matthieu M.所提到的,在C ++ 11中使用Strongly typed enumerations

在C ++ 03中模拟它们的好方法是将枚举包装在命名空间中。它比包装在struct更好,因为该命名空间可能具有可以使用参数依赖的名称查找找到的函数。 E.g:

namespace MyEnum {
  enum Type {
    Value0,
    Value1
  };

  std::ostream& operator<<(std::ostream&, Type);
  std::istream& operator>>(std::istream&, Type&);
}

MyEnum::Type value;
std::cout << value; // uses the overload from MyEnum
std::cin >> value; // uses the overload from MyEnum

答案 3 :(得分:0)

这取决于。努力减少实施细节的曝光。例如。将事物包含在命名空间和/或类和/或单独编译的实现文件中。而且希望非常清楚,全局命名空间和类内绝对不是唯一的选择。即,在课堂上宣布某些东西并不是减少曝光的唯一方法(那么还有什么方法呢? - 哦,好吧,记住这个答案的第三句话。)