如果所述枚举仅用于类成员函数中,是否应在类内部或外部声明枚举?
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
答案 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)
这取决于。努力减少实施细节的曝光。例如。将事物包含在命名空间和/或类和/或单独编译的实现文件中。而且希望非常清楚,全局命名空间和类内绝对不是唯一的选择。即,在课堂上宣布某些东西并不是减少曝光的唯一方法(那么还有什么方法呢? - 哦,好吧,记住这个答案的第三句话。)