C++:使用“枚举类”在类中进行枚举

div*_*ode 6 c++ enums enum-class

在类中编写枚举的正确方法是什么?我正在用 C++ 编写康威的生命游戏代码。所以我有一个模式类,其中包含有关不同类型模式的信息:

class Patterns
{
public:
    Patterns();
    ~Patterns(void);

private:
    enum class PatternType
    {
        bloat,
        block,
        blinker,
        toad
    };

    PatternType pattern_;
};
Run Code Online (Sandbox Code Playgroud)

我的目标不是污染这里的全球空间。这就是在类内部编写枚举的编写方式,同时牢记 oops 概念。如果没有,请建议一些更好的替代方法以及它们相对于此方法的好处是什么。欢迎任何有关在类中编写枚举时记住事项的意见。

编辑:@Jay Miller 根据他的输入,我尝试了他的所有三种方法

class Patterns
{
public:
    Patterns();
    ~Patterns(void);

private:
    enum class PatternType
    {
        bloat,
        block,
        blinker,
        toad
    };

    PatternType pattern_;
};
Run Code Online (Sandbox Code Playgroud)

我的发现(在尝试了代码并谷歌搜索了一下之后):

  1. 在我的例子中,PatternSimple 是在类内部编写枚举的最简单方法;但它会损害类型安全性,即我可以将枚举值与任何其他数据类型进行比较,并且不会给出任何错误。
  2. PatternClassIn 提供类型安全;但我必须在调用函数中编写更多代码才能访问枚举值。
  3. PatternClassOut 提供了两全其美的方法。它提供了类型安全性,此外,调用函数访问枚举值的代码与PatternSimple相同。

Jay*_*ler 3

假设您希望在课堂之外使用它,那么将枚举公开是有意义的。作为enum class,除了类名之外,您还需要枚举名称来访问值:

class Patterns {
public:
    enum class PatternType { ... };
...
};
void makePattern(Patterns::PatternType value) { ... };
makePattern(Patterns::PatternType::bloat);
Run Code Online (Sandbox Code Playgroud)

因为它是一个枚举类,所以将其移到另一个类之外可能是完全有效的。全局命名空间中唯一添加的内容是枚举的名称。

enum class Patterns {
   bloat,
   ...
};
void makePattern(Patterns value) { ... };
makePattern(Patterns::bloat);
Run Code Online (Sandbox Code Playgroud)

如果您有其他操作想要与枚举分组,那么将其嵌套在类中是有意义的。在这种情况下,您可能决定只使用enum而不是enum class

class Patterns {
public:
    enum PatternType { ... };
    std::string toString() const { ... };
    ...
private:
    PatternType value;
};
...
...
void makePattern(Patterns::PatternType value) { ... };
makePattern(Patterns::bloat);
Run Code Online (Sandbox Code Playgroud)