Используя перечисление как индекс массива

Я только что обновился до XCode 9, и он начал давать мне эту проблему. Я создал новый набор изображений в разделе «Активы» и добавил изображения, которые я хотел для этого, а затем добавил их к своим изображениям на вкладке с пользовательскими именами, и он отлично работал. Надеюсь, это поможет!

56
задан Shog9 31 December 2008 в 23:13
поделиться

7 ответов

этот хороший стиль программирования?

я думаю так. Я делаю то же самое вполне часто.

там лучший способ сделать это?

class Button
{
public:
    // Used for array indexes!  Don't change the numbers!
  enum State {
    NORMAL = 0,
    PRESSED,
    CLICKED,
    NUMBER_OF_BUTTON_STATES
  };
};

Недостаток состоит в том, что NUMBER_OF_BUTTON_STATES является теперь допустимым Кнопка:: Состояние значение. Не большая проблема, если Вы раздаете эти значения как ints. Но проблема, если Вы на самом деле ожидаете Кнопка:: Состояние .

Используя перечисление, поскольку индекс массива не чувствует себя хорошо.

Это прекрасно. Всего ДОКУМЕНТ это, таким образом, следующий парень знает то, что продолжается! (Это - то, для чего комментарии.)

я должен определить значения перечисления?

Без '=' присвоение, перечисление предполагается к , запускаются в нуле и инкременте вверх.

, Если перечислимая запись имеет '=' присвоенное значение, последующее не '=', перечислимые записи продолжают рассчитывать оттуда.

Источник: Аннотируемый Справочник C++, pg 113

Однако мне нравится определять начальное значение только для создания кода что намного более ясным.

49
ответ дан Mr.Ree 7 November 2019 в 16:44
поделиться

Да это будет работать хорошо. Однако в любом случае действительно необходимо поместить другую запись в перечисление, определяющее значение количества объектов:

enum ButtonState {
    BUTTON_NORMAL,
    BUTTON_PRESSED,
    BUTTON_CLICKED,
    STATE_COUNT
};

Тогда можно определить массив как

Color colors[STATE_COUNT];

иначе, это - путаница для хранения суммы состояний синхронной с размером массива. Перечисления будут всегда запускаться с нуля, если не иначе инициализированный, и затем каждой дополнительной записи присвоят значение один выше предыдущего, если не иначе инициализированный. Конечно, также не причинило бы боль при помещении нуля явно, если Вы хотите. Если бы Вы не возражаете против дополнительного кода, я обернул бы доступ к необработанному массиву с помощью функции как

Color & operator[](ButtonState state) {
    return array[state];
}

Или эквивалент getColor функция, передающая запрос. Это запретило бы непосредственно индексацию массива с некоторым целым числом, которое почти наверняка в какой-то момент перестанет работать, потому что каждый понимает индексы превратно.

23
ответ дан Johannes Schaub - litb 7 November 2019 в 16:44
поделиться

Совершенно нормально использовать перечисление для индексации в массив.

Вы не должны определять каждое перечисление значений, они увеличат автоматически 1. Разрешение компилятору выбрать значения уменьшает возможность ввода с опечатками и создания ошибки, но это лишает Вас наблюдения значений, которые могли бы быть полезными в отладке.

1
ответ дан Mark Ransom 7 November 2019 в 16:44
поделиться

Мудрый стилем, это очень хорошо.

основанные на Паскале языки как Дельфи позволяют границам массива быть определенными как перечислимый тип, таким образом, можно только использовать объекты того определенного типа как индекс.

3
ответ дан Roddy 7 November 2019 в 16:44
поделиться

Вопрос 1: Я думаю, что это - хороший стиль программирования. Я использую все это время. Вопрос 2: Насколько я знаю, это, как гарантируют, проложит себе путь, таким образом, Вы не должны будете определять значения.

И я поместил бы NUM_BUTTON_STATES в перечисление также.

3
ответ дан 7 November 2019 в 16:44
поделиться

Это прекрасно, но я хотел бы сделать некоторые границы, проверяющие массив, как будто кто-то добавляет другой ButtonState, у Вас будет проблема.

кроме того, элементы массива цветов неизменны, поэтому возможно, смотрят на использование различного набора для выстраивания так, чтобы можно было осуществить ту неизменность. Возможно, Dictionary<ButtonState,ButtonColor>

1
ответ дан WOPR 7 November 2019 в 16:44
поделиться

Используя перечисление в порядке. Но Вы не должны определять значения для каждого объекта. Достаточно определить первое значение. Я не предположил бы, что перечисления запускаются в 0, потому что я использовал компиляторы, которые использовали 1 в качестве начального значения (не для ПК, но некоторые компиляторы для микроконтроллеров имеют некоторое странное поведение). Кроме того, Вы могли избавиться от константы:

enum ButtonState {
    BUTTON_NORMAL = 0,
    BUTTON_PRESSED,
    BUTTON_CLICKED,
    NUM_BUTTON_STATES
};
15
ответ дан Stefan 7 November 2019 в 16:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: