5

我正在为我正在研究的课程使用枚举,并且正在使用 Google 查找示例以确保我正确使用了枚举。我去了几个站点,包括 MSDN 站点,枚举列在公共而不是私有下。我一直认为数据成员是私有的。我离开基地了吗?如果是,为什么?

4

4 回答 4

18

枚举是一种类型,而不是数据成员。如果该课程的用户需要了解它,您应该将其公开;否则,将其设为私有。用户需要了解它的典型情况是当它用作公共成员函数的参数类型时。

于 2012-08-14T16:39:10.153 回答
4

枚举不是数据成员,它们是常量/类型。如果您不将它们公开,则其他类无法与enum使用枚举名称定义的类交互:

class A {
  public:
    void func(enumtype e) { if (e == e1) dostuff(); }
  private:
    typedef enum {e1, e2} enumtype;
};

int main() {
  A a;
  a.func(e1); // error: enumtype is private, e1 is not visible here
  return 0;
}
于 2012-08-14T16:42:49.343 回答
3

这些枚举可能在类接口中使用,对吧?否则,保留它们确实会更清洁private

于 2012-08-14T16:39:26.580 回答
1

公共enum数据在模板元编程中大量使用(参见Boost.MPL

#include <iostream>

template <int N>
struct Factorial {
    enum { value = N * Factorial<N - 1>::value };
};

template <>
struct Factorial<0> {
    enum { value = 1 };
};

int main()
{
    auto const f10 = Factorial<10>::value; // done at compile-time
    std::cout << f10 << "\n";              // prints 3628800

    return 0;
}

Ideone上输出。此处公开使用的原因enum是该结构只是将中间计算传输到顶级调用者的简单工具,并且不需要封装。它是编译时函数求值的粗略形式,其中struct充当函数范围,enum充当返回值。

于 2012-08-14T18:41:09.323 回答