【问题标题】:c++: enum inside of a class using "enum class"c ++:使用“枚举类”在类中枚举
【发布时间】:2014-11-20 16:03:17
【问题描述】:

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

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

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

    PatternType pattern_;
};

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

编辑:@Jay Miller 根据他的意见,我已经尝试了他的所有三种方法

enum class PatternClassOut{ point, circle, triangle };

class Patterns
{
public:
  enum PatternSimple{bloat, block, blinker, toad};
  enum class PatternClassIn{cat, mouse, dog};
  //get set functions for all the enum variables

private:
  PatternClassOut  out_;
  PatternSimple    simple_;
  PatternClassIn   in_;
};

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

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

【问题讨论】:

  • 如果枚举是类的公共接口的一部分,那么每次都强制调用者在其前面加上Patterns:: 前缀可能会变得很麻烦。但如果它真的像您的示例代码所示是私有的,那很好。

标签: c++ enums enum-class


【解决方案1】:

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

class Patterns {
public:
    enum class PatternType { ... };
...
};
void makePattern(Patterns::PatternType value) { ... };
makePattern(Patterns::PatternType::bloat);

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

enum class Patterns {
   bloat,
   ...
};
void makePattern(Patterns value) { ... };
makePattern(Patterns::bloat);

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

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

【讨论】:

  • ...::bloat ::chuckles::
【解决方案2】:

我会做到public,否则你已经按照我的方式做到了。

【讨论】:

  • 有没有办法将常量从enum(或enum class)批发到一个作用域,比如类作用域?
  • @Deduplicator:enums 已经这样做了。 enum class 的发明部分是为了阻止这种情况的发生。
  • 当然enums 会自动使用立即封闭的范围来执行此操作。我只是想要一种方法来使用另一个范围,或者使用 enum class 和封闭范围,因为还有一些其他差异。
  • @Deduplicator:IDGI。如果您不想利用 soleenum 的剩余差异,为什么还要使用带有默认基础类型的enum class?为什么不使用enum?这没有任何意义。
  • 转换为基础整数类型对于无范围枚举是隐式的,对于范围枚举是显式的。另外,我可能出于某种原因想在另一个枚举的声明中添加一个枚举的所有枚举数,或者由于某种原因,我只知道将它们添加到某个类中,尽管我没有在其中定义枚举。
【解决方案3】:

您的方法没问题,唯一的缺点是如果您尝试从类外部访问 PatternType,它将无法访问,因为它被声明为私有。

【讨论】:

  • 我不理解你的第二段。你能扩展一下吗?
  • 这取决于污染全局命名空间的含义。如果污染全局命名空间意味着声明要在程序启动之前初始化的全局变量,减慢程序初始化并且可以从文件范围内的任何单个函数中使用,则枚举不计入它。如果您使用的是 c++0x,我会再次通知您使用枚举类。
  • 正在使用enum class。我还没有真正关注你。
  • @LightnessRacesinOrbit 我将删除我的答案中有问题的部分。也许我缺少代码污染定义的含义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多