|
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
|
||||||
Перечисления (enum): для чего они нужны? Как, когда и какими перечислениями уместнее пользоваться?18.02.2017, 21:12. Показов 19213. Ответов 40
Предположим есть такой код:
0
|
||||||
| 18.02.2017, 21:12 | |
|
Ответы с готовыми решениями:
40
Что за драйвера такие, для чего они и нужны ли они вообще? Зачем нужны перечисления enum? |
|
69 / 68 / 52
Регистрация: 28.10.2015
Сообщений: 388
|
||
| 18.02.2017, 21:19 | ||
|
0
|
||
|
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
|
||||||
| 18.02.2017, 22:05 [ТС] | ||||||
|
На примере данного кода я правильно понимаю, что переменная а относится к SU6, а переменная b относится к SU29???
0
|
||||||
|
Модератор
|
||||||||||||||||||||||||||||||||
| 18.02.2017, 22:27 | ||||||||||||||||||||||||||||||||
Сообщение было отмечено Photofenix как решение
Решение
Photofenix, перечисление (enum) используется, если необходимо задать несколько именованных целочисленных констант. Можно задать именованные константы так:
Добавлено через 1 минуту Photofenix, можно задать безымянный enum:
Photofenix, сравните два варианта кода:
Photofenix, какой код понятнее?
2
|
||||||||||||||||||||||||||||||||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
| 18.02.2017, 23:11 | |
enum зло, используйте enum class
0
|
|
|
56 / 56 / 31
Регистрация: 24.10.2016
Сообщений: 186
|
||
| 19.02.2017, 00:01 | ||
|
Вот Страуструп по этому поводу: • Стандартные перечисления (enums) могут неявно преобразовываться к int, что может приводить к ошибкам, если кто-то не хочет, чтобы перечисления вели себя как целые числа. • Стандартные перечисления экспортируют свои значения в окружающую (surrounding) область видимости (scope), что приводит к коллизиям имен. • Невозможно указать тип, лежащий в основе стандартных перечислений (underlying type), что приводит к непониманию, проблемам совместимости и делает предварительное объявление (forward declaration) невозможным. Что здесь есть зло, которое вот прям запрещает пользоваться стандартным энумом?
0
|
||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
| 19.02.2017, 00:24 | |
|
OlafNestandart, вы понимаете, что
enum class ввели, чтобы решать какие-то проблемы? Зачем их придумали, если enum был идеальный. И не стоит начинать дискуссию с агрессии. Объясните минусы enum хотя бы, чтобы я понял ваше мнение
0
|
|
|
41 / 41 / 11
Регистрация: 02.04.2016
Сообщений: 313
|
|||
| 19.02.2017, 02:53 | |||
|
Так вот, такие состояния мне было удобно хранить с помощью переменной типа enum, в списке констант которого я указывал наименования состояний. В данном случае, значения самих констант меня не интересовали (смешно, но преподаватель по какой-то причине хотела забраковать такой подход, показав, что я ошибаюсь (типа значения этих констант всё-таки играют роль в моём коде), но, переставив несколько значений в моём списке, не добилась своего). Удобство в следующем: при использовании switch(enum_var) компилятор контролирует количество case, которое должно быть равно количеству констант, описанных в этом enum. Это удобно в приложении на 2 тысячи строк, так как добавить тут и убрать там - очень просто, но забыть про "сям" - ещё проще. Конечно, сам я организацию кода оценивал очень плохо после последней строки кода, ибо много зависимостей. Ну и, конечно, удобно просто называть состояния своими именами, а не 1, 2, 3. Не по теме: Модераторы\администраторы, почему съедаются слова в уже написанном тексте? CTRL+Z, вроде, не нажимал. Добавлено через 2 часа 24 минуты Все изменения идут на улучшение современных огромных программ. А для маленьких - смысл использовать лямбды, STD, enum class, собственные литералы, только если не в качестве самообучения? Ну, а в качестве самообучения можно и самому написать более подробные аналоги каждой конструкции из синтаксического сахара. В больших проектах использование новых возможностей само собой разумеется. Можно ещё сказать, что Ваше поведение - это "проклятие знания", как я где-то читал. То есть, Вам уже не понять, как сложно использовать что-то более абстрактное и нацеленное на решение общих проблем, когда нужно решить частную.
1
|
|||
|
Модератор
|
|||||||||||||||||
| 19.02.2017, 08:36 | |||||||||||||||||
enum class, если они не поддерживают неявных преобразований?Вот такой вариант не компилируется (ни с флагом -std=c++11, ни с флагом -std=c++14):
ошибки
||=== Build: Debug in C++14_MinGW_Test (compiler: GNU GCC Compiler) ===| E:\0_0\cbProjects\C++14_MinGW_Test\main. cpp||In function 'int main()':| E:\0_0\cbProjects\C++14_MinGW_Test\main. cpp|13|error: could not convert 'SU6' from 'main()::Airplain' to 'int'| E:\0_0\cbProjects\C++14_MinGW_Test\main. cpp|17|error: could not convert 'SU29' from 'main()::Airplain' to 'int'| E:\0_0\cbProjects\C++14_MinGW_Test\main. cpp|21|error: could not convert 'SU29' from 'main()::Airplain' to 'int'| ||=== Build failed: 3 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===| Такой вариант тоже не завёлся (ни с флагом -std=c++11, ни с флагом -std=c++14):
ошибки
||=== Build: Debug in C++14_MinGW_Test (compiler: GNU GCC Compiler) ===| E:\0_0\cbProjects\C++14_MinGW_Test\main. cpp||In function 'int main()':| E:\0_0\cbProjects\C++14_MinGW_Test\main. cpp|6|error: anonymous scoped enum is not allowed| E:\0_0\cbProjects\C++14_MinGW_Test\main. cpp|6|error: invalid type in declaration before '{' token| E:\0_0\cbProjects\C++14_MinGW_Test\main. cpp|6|error: 'SU6' was not declared in this scope| E:\0_0\cbProjects\C++14_MinGW_Test\main. cpp|6|error: 'SU29' was not declared in this scope| E:\0_0\cbProjects\C++14_MinGW_Test\main. cpp|6|error: 'SU34' was not declared in this scope| E:\0_0\cbProjects\C++14_MinGW_Test\main. cpp|6|error: scalar object 'Airplane' requires one element in initializer| E:\0_0\cbProjects\C++14_MinGW_Test\main. cpp|14|error: 'Airplane' is not a class, namespace, or enumeration| E:\0_0\cbProjects\C++14_MinGW_Test\main. cpp|18|error: 'Airplane' is not a class, namespace, or enumeration| E:\0_0\cbProjects\C++14_MinGW_Test\main. cpp|22|error: 'Airplane' is not a class, namespace, or enumeration| ||=== Build failed: 9 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===| Получается, надо явно кастовать каждый элемент перечисления к int. У меня только так заработало:
0
|
|||||||||||||||||
|
Модератор
|
||||||
| 19.02.2017, 08:56 | ||||||
|
rikimaru2013, и если без явного приведения типа никак, то, как по мне, лучше уж тогда вместо enum'a использовать собственный неймспейс и несколько констант (при условии, что констант там не несколько сотен, а, скажем, три-четыре штуки):
0
|
||||||
|
Модератор
|
||||||
| 19.02.2017, 09:06 | ||||||
|
А вот если использовать именованные
перечисления с неограниченной областью видимости (unscoped enumeration), то есть, enum'ы старого образца, без ключевого слова class, то всё работает, как часы:
0
|
||||||
|
Любитель чаепитий
|
|||||||
| 19.02.2017, 10:37 | |||||||
enum class в примере #4. Во-вторых, не то кастуете. )))
2
|
|||||||
|
Модератор
|
|||
| 19.02.2017, 10:58 | |||
|
0
|
|||
|
Любитель чаепитий
|
||||||||
| 19.02.2017, 11:06 | ||||||||
|
Вообще, такое объявление сродни такому:
Добавлено через 2 минуты
1
|
||||||||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
| 19.02.2017, 12:37 | |
|
0
|
|
|
Модератор
|
|||
| 19.02.2017, 12:50 | |||
0
|
|||
| 19.02.2017, 12:58 | |
|
0
|
|
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||
| 19.02.2017, 13:05 | ||
|
0
|
||
| 19.02.2017, 13:05 | |
|
Помогаю со студенческими работами здесь
20
Struts для чего они нужны? .elf и для чего они нужны
Что такое саттелиты и для чего они нужны? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|