Наличие повторяющихся значений перечислителя - PullRequest
1 голос
/ 20 ноября 2011

Я создаю клон тетриса в C ++, и у меня есть enum GameProperty, который указан следующим образом:

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

В моем случае я только использую эти значения при циклическом просмотре тайлов тетромино, например:

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

1010 *
*

При каких обстоятельствах считается плохой практикой иметь несколько счетчиков с одинаковым значением?

Ответы [ 3 ]

7 голосов
/ 20 ноября 2011

Это не должны быть значения в одном enum. Они должны быть отдельными константами. Чтобы понять почему, посмотрите на код как i < TETROMINO_TILES. Сравнение integer с GameProperty, которое может иметь значения, такие как TETROMINO_ROTATIONS. Это не имеет смысла.

1 голос
/ 20 ноября 2011

Используйте enum, если вы хотите создать новый отдельный тип, который не является действительно скалярным значением.Например, colors может быть перечислено и, следовательно, пронумеровано, но эти числа на самом деле ничего не значат.

Если вы присваиваете значащие числа перечислителям, это признак того, что выможет действительно понадобиться что-то вроде этого:

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

Теперь вы можете использовать тот же синтаксис, что и объявления using, и эти константы работают в for циклах и выражениях без преобразования.

Для другого примера, следующие оба являются правильными, но не должны меняться местами между enum и int:

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;
};
0 голосов
/ 20 ноября 2011

Определите перечисление так же, как вы определяете класс. Концептуально это должен быть набор значений для ОДНОГО свойства, а не несколько подключенных свойств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...