【发布时间】:2012-03-09 08:05:47
【问题描述】:
如果枚举只在类成员函数中使用,你应该在类内部还是外部声明枚举?
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
【问题讨论】:
-
与所有 [编码风格] 问题一样,答案是“视情况而定”。
-
可能有人比我有更多的洞察力,但我的策略一直是在需要暴露之前不暴露。 (换句话说,如果它只是在内部使用,则保留在内部。)
-
与编码风格问题一样,没有明确的答案。由于声明冲突的风险,污染全局范围通常不是一个好主意,但如果您保留在“自己的”命名空间内,这完全是一个偏好问题。
-
我在私有部分的类内声明枚举(或其他任何东西),前提是类本身需要内部。在所有其他情况下,我更喜欢在外部定义它,尤其是在 C++11 中,因为如果你在类内部声明它,你将无法在 lambda 中使用它。
-
您也许可以重构 replace the enum with a class hierarchy,例如状态或策略模式。
标签: c++ coding-style enums namespaces