Как определить перечислимый тип (перечисление) в C?

В одном смысле я думаю, что Ваш вопрос сводится только к, "почему использование взаимодействует через интерфейс и не абстрактные классы?" Технически, можно достигнуть слабой связи и с - конкретная реализация все еще не подвергнута коду вызова, и можно использовать Шаблон "абстрактная фабрика" для возврата конкретной реализации (интерфейсная реализация по сравнению с расширением абстрактного класса) для увеличения гибкости дизайна. На самом деле Вы могли утверждать, что абстрактные классы дают Вам немного больше, так как они позволяют, Вы обоим требуете, чтобы реализации удовлетворили Ваш код ("НЕОБХОДИМО реализовать, запускаются ()"), и обеспечьте реализации по умолчанию ("У меня есть стандартная краска (), можно переопределить, если Вы хотите к") - с интерфейсами, реализации должны быть обеспечены, который со временем может приводить к хрупким проблемам наследования через интерфейсные изменения.

Существенно, тем не менее, я использую интерфейсы главным образом из-за ограничения единичного наследования Java. Если моя реализация ДОЛЖНА наследоваться абстрактному классу, который будет использоваться кодом вызова, который означает, что я теряю гибкость для наследования чему-то еще даже при том, что это может иметь больше смысла (например, для повторного использования кода или иерархии объектов).

263
задан Stéphane Gimenez 12 August 2011 в 16:16
поделиться

5 ответов

Объявление переменной перечисления выполняется следующим образом:

enum strategy {RANDOM, IMMEDIATE, SEARCH};
enum strategy my_strategy = IMMEDIATE;

Однако вы можете использовать typedef , чтобы сократить объявления переменных, например:

typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy my_strategy = IMMEDIATE;

Имея имя соглашение о различении типов и переменных - хорошая идея:

typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy_type;
strategy_type my_strategy = IMMEDIATE;
368
ответ дан 23 November 2019 в 02:29
поделиться

Когда вы говорите

enum {RANDOM, IMMEDIATE, SEARCH} strategy;

, вы создаете единственную переменную экземпляра, называемую «стратегией» безымянного перечисления. Это не очень полезная вещь - вам понадобится typedef:

typedef enum {RANDOM, IMMEDIATE, SEARCH} StrategyType; 
StrategyType strategy = IMMEDIATE;
48
ответ дан 23 November 2019 в 02:29
поделиться

Стоит отметить, что вам не нужен typedef . Вы можете просто сделать это следующим образом

enum strategy { RANDOM, IMMEDIATE, SEARCH };
enum strategy my_strategy = IMMEDIATE;

Это вопрос стиля, предпочитаете ли вы typedef . Без него, если вы хотите обратиться к типу перечисления, вам нужно использовать стратегию перечисления . С его помощью вы можете просто сказать стратегия .

У обоих способов есть свои плюсы и минусы. Один более многословен, но сохраняет идентификаторы типов в пространстве имен тегов, где они не будут конфликтовать с обычными идентификаторами (вспомните struct stat и функцию stat : они не конфликт тоже), и тут сразу видно, что это тип. Другой короче, но переносит идентификаторы типов в обычное пространство имен.

449
ответ дан 23 November 2019 в 02:29
поделиться

Стоит упомянуть, что в C ++ вы можете использовать "enum" для определения нового type без использования оператора typedef.

enum Strategy {RANDOM, IMMEDIATE, SEARCH};
...
Strategy myStrategy = IMMEDIATE;

Мне этот подход намного удобнее.

[edit - уточнен статус C ++ - у меня это было изначально, потом удалили!]

10
ответ дан 23 November 2019 в 02:29
поделиться

Как написано, в вашем коде нет ничего плохого. Вы уверены, что не сделали что-то вроде

int strategy;
...
enum {RANDOM, IMMEDIATE, SEARCH} strategy;

На какие строки указывают сообщения об ошибках? Когда он говорит, что «предыдущая декларация« стратегии »была здесь», что «здесь» и что это показывает?

13
ответ дан 23 November 2019 в 02:29
поделиться
Другие вопросы по тегам:

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