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

aCu*_*ria 13 c++ enums coding-style 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
Run Code Online (Sandbox Code Playgroud)

Mat*_* M. 14

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

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

enum class MyEnum {
  Value0,
  Value1
};
Run Code Online (Sandbox Code Playgroud)

必须被调用为MyEnum::Value0(而不是Value0).

在C++ 03中,您可以通过以下方式或多或少地模拟这个:

struct MyEnum {
  enum Type {
    Value0,
    Value1
  };
};
Run Code Online (Sandbox Code Playgroud)

但是,枚举的类型MyEnum::Type却略有不同.

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


Alo*_*ave 7

如果只有你的类成员使用enum它,最好enum在类中声明.
这可以防止命名空间/全局空间因不必要的符号名称而受到污染,
并且对于类的用户来说它更直观,它有助于用户知道enum该类只会被类使用.

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

  • 如果不假设全局名称空间是唯一的选择,“这可以防止全局空间受到污染”就没有意义。 (2认同)