【问题标题】:Is it a good practice to use enum as int?将 enum 用作 int 是一种好习惯吗?
【发布时间】:2011-02-10 21:38:48
【问题描述】:

所以,我在一个类中有一个变量“状态”。我想将它声明为一个整数,这样我就可以保存一些 if 语句。

int state;

一种方法是声明一个枚举状态{One = 0, Two = 1, Three = 3},然后在switch语句中,它会变成:

switch (state)
{
case One:
    dosomething();
    break;
case Two:
    dosomething();
    break;
case Three:
    dosomething();
    break;
}

那么,像这样使用枚举是一个好习惯吗? 有没有更好的方法来做到这一点?

谢谢!

【问题讨论】:

  • 用名为OneTwoThree 的枚举器对应于值012 声明一个枚举是一个非常糟糕的主意。
  • 对应的值其实是0、1、3。:)

标签: c++ enums int


【解决方案1】:

是的,这是一个很好的方法。您通常使用enums 让生活更轻松,许多不同的数字并不能真正告诉其他编码人员任何事情并没有多大帮助。

所以这是一种非常好的使用方式,它使您的代码可读且易于理解。

尽管正如@James McNellis 指出的那样,将枚举命名为“1,2,3,4”是一个坏主意,因为它并不能表达它的真正作用。

但我怀疑这只是你的一个例子。

请考虑这个:

switch (operationState)
{
    case Waiting:
        dosomething();
        break;
    case Running:
        dosomething();
        break;
    case Ended:
        dosomething();
        break;
}

在这种情况下,“操作”是:Waiting、Running 或 Ended,这使得它具有可读性和可理解性。现在考虑没有枚举的方式:

switch (iState)
{
    case 997:
        dosomething();
        break;
    case 998:
        dosomething();
        break;
    case 999:
        dosomething();
        break;
}

997 告诉你什么?绝对没有!使用易读易懂的代码让每个人的生活更轻松。

【讨论】:

  • 很好地解释了为什么枚举如此有用。它们在开发代码时真正发挥作用,并且您有代码提示,输入myEnum::,然后列出您可以使用的所有值的列表真是太棒了。记住你可以改变枚举的实际值是很好的,并且代码“不应该”中断......但有些人可能做了一些奇怪的事情,比如读出枚举的值,然后依赖关于它的价值。但我会说那是他们糟糕的代码,而不是你的。
【解决方案2】:

如果您将state 声明为State 而不是int,则上述所有代码都可以正常工作。您可以在 switch 语句中使用它,为其分配新值,与它进行比较等。在这里使用 int 确实没有任何好处,因为这实际上是“在源代码中”。您的变量不是整数。将其乘以或除以一个值,或将其向左或向右位移是没有意义的。将变量标记为State 可以更清楚地表明您确实持有多个值之一,并防止您犯上述一些错误。另外,它使编译器有更好的机会来诊断这样的事情:

state = 137; // Error!  Can't do this assignment without a cast.

一般来说,使用类型系统对您有利。如果是int,则将其设为int。如果是枚举类型,则设为枚举类型。

【讨论】:

    【解决方案3】:

    在 switch 语句中使用可读的状态名称而不是数字,对我来说似乎很好。 而且我认为这也不会影响性能。

    所以没有理由不使用枚举!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-28
      • 2023-04-07
      • 2019-03-06
      • 2013-03-30
      • 2015-09-02
      • 2018-05-05
      • 1970-01-01
      • 2011-03-06
      相关资源
      最近更新 更多