具有重复的枚举器值

Having duplicate enumerator values

本文关键字:枚举      更新时间:2023-10-16

我正在C++中创建一个俄罗斯方块克隆,并且我有一个枚举GameProperty,其指定如下:

enum GameProperty {
    NUM_OF_TETROMINOES  = 7,
    NUM_OF_TILES        = 4,
    TETROMINO_ROTATIONS = 4
};

在我的情况下,当循环通过tetromino的瓦片时,我使用这些值,例如:

for (int i = 0; i < TETROMINO_TILES; i++) { }


在任何情况下,拥有多个具有相同值的枚举器都被认为是不好的做法吗?

这些不应该是单个enum中的值。它们应该是单独的常量。要了解原因,请查看类似i < TETROMINO_TILES的代码。将integer与可以具有类似TETROMINO_ROTATIONS的值的GameProperty进行比较。这毫无意义。

当您想要创建一个新的、不同的类型,而并不是真正的标量值时,请使用enum。例如,颜色可以被枚举,因此可以被编号,但这些数字实际上并不意味着什么。

如果你正在为枚举器分配有意义的数字,这表明你可能真的想要这样的东西:

namespace GameProperty { // completely different concepts with unifying theme
    int const num_tetrominoes  = 7,
              num_tiles        = 4,
              num_rotations    = 4;
};

现在,您可以使用相同的语法以及using声明,并且这些常量在for循环和表达式中工作,不需要转换。

例如,以下两项都是正确的,但不应在enumint之间交换:

namespace wavelengths { // closely related quantities
    typedef int wavelength_t; // maybe we will express in-between values
    wavelength_t const red    = 750,
                       green  = 550,
                       blue   = 400;
};
enum colors { // qualitatively different but related as one-of-many
    red,
    green,
    blue;
};

定义枚举就像定义类一样。从概念上讲,它应该是一个属性值的集合,而不是装配多个属性。