63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
|
||||||
1 | ||||||
Перечисления (enum): для чего они нужны? Как, когда и какими перечислениями уместнее пользоваться?18.02.2017, 21:12. Показов 17381. Ответов 40
Предположим есть такой код:
0
|
18.02.2017, 21:12 | |
Ответы с готовыми решениями:
40
Для чего нужны сужающие преобразования как они работают и на сколько они важны? Что за драйвера такие, для чего они и нужны ли они вообще? Зачем нужны перечисления enum? Struts для чего они нужны? |
69 / 68 / 52
Регистрация: 28.10.2015
Сообщений: 388
|
|
18.02.2017, 21:19 | 2 |
enum нужен в тех случаях, когда нужно показать, что некая переменная должна принимать значения только из указанного списка.
0
|
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
|
||||||
18.02.2017, 22:05 [ТС] | 3 | |||||
На примере данного кода я правильно понимаю, что переменная а относится к SU6, а переменная b относится к SU29???
0
|
Модератор
|
|||||||||||||||||||||||||||||||
18.02.2017, 22:27 | 4 | ||||||||||||||||||||||||||||||
Сообщение было отмечено Photofenix как решение
Решение
Photofenix, перечисление (enum) используется, если необходимо задать несколько именованных целочисленных констант. Можно задать именованные константы так:
Да. Добавлено через 1 минуту Photofenix, можно задать безымянный enum:
Photofenix, сравните два варианта кода:
Photofenix, какой код понятнее?
2
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
18.02.2017, 23:11 | 5 |
enum зло, используйте enum class
0
|
56 / 56 / 31
Регистрация: 24.10.2016
Сообщений: 186
|
|
19.02.2017, 00:01 | 6 |
30 лет не были злом, а тут резко с выходом c++11 они стали злом. Я с вас поражаюсь - услышали что то и повторяете, как попугаи.
Вот Страуструп по этому поводу: • Стандартные перечисления (enums) могут неявно преобразовываться к int, что может приводить к ошибкам, если кто-то не хочет, чтобы перечисления вели себя как целые числа. • Стандартные перечисления экспортируют свои значения в окружающую (surrounding) область видимости (scope), что приводит к коллизиям имен. • Невозможно указать тип, лежащий в основе стандартных перечислений (underlying type), что приводит к непониманию, проблемам совместимости и делает предварительное объявление (forward declaration) невозможным. Что здесь есть зло, которое вот прям запрещает пользоваться стандартным энумом?
0
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
19.02.2017, 00:24 | 7 |
OlafNestandart, вы понимаете, что
enum class ввели, чтобы решать какие-то проблемы? Зачем их придумали, если enum был идеальный. И не стоит начинать дискуссию с агрессии. Объясните минусы enum хотя бы, чтобы я понял ваше мнение
0
|
41 / 41 / 11
Регистрация: 02.04.2016
Сообщений: 313
|
|
19.02.2017, 02:53 | 8 |
Понятнее станет, когда столкнётесь с обработкой ошибок. Допустим, у приложения есть строго определённые состояния, которые изменяются функциями внутри этого приложения и почти не зависят от внешней среды - она напрямую не может изменить состояние, только через "адаптер" - функцию.
Так вот, такие состояния мне было удобно хранить с помощью переменной типа enum, в списке констант которого я указывал наименования состояний. В данном случае, значения самих констант меня не интересовали (смешно, но преподаватель по какой-то причине хотела забраковать такой подход, показав, что я ошибаюсь (типа значения этих констант всё-таки играют роль в моём коде), но, переставив несколько значений в моём списке, не добилась своего). Удобство в следующем: при использовании switch(enum_var) компилятор контролирует количество case, которое должно быть равно количеству констант, описанных в этом enum. Это удобно в приложении на 2 тысячи строк, так как добавить тут и убрать там - очень просто, но забыть про "сям" - ещё проще. Конечно, сам я организацию кода оценивал очень плохо после последней строки кода, ибо много зависимостей. Ну и, конечно, удобно просто называть состояния своими именами, а не 1, 2, 3. Не по теме: Модераторы\администраторы, почему съедаются слова в уже написанном тексте? CTRL+Z, вроде, не нажимал. Добавлено через 2 часа 24 минуты Я не OlafNestandart, но скажу, что постоянно указывать область, из которой брать переменную - немного накладно, если это единственный enum, объявленный в маленьком классе. Просто смысл уточнений области видимости всякий раз, если конфликтов в таком классе быть не может априори? Все изменения идут на улучшение современных огромных программ. А для маленьких - смысл использовать лямбды, STD, enum class, собственные литералы, только если не в качестве самообучения? Ну, а в качестве самообучения можно и самому написать более подробные аналоги каждой конструкции из синтаксического сахара. В больших проектах использование новых возможностей само собой разумеется. Можно ещё сказать, что Ваше поведение - это "проклятие знания", как я где-то читал. То есть, Вам уже не понять, как сложно использовать что-то более абстрактное и нацеленное на решение общих проблем, когда нужно решить частную.
1
|
Модератор
|
||||||||||||||||
19.02.2017, 08:36 | 9 | |||||||||||||||
rikimaru2013, и как переделать приведённые мной примеры с помощью
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 | 10 | |||||
rikimaru2013, и если без явного приведения типа никак, то, как по мне, лучше уж тогда вместо enum'a использовать собственный неймспейс и несколько констант (при условии, что констант там не несколько сотен, а, скажем, три-четыре штуки):
0
|
Модератор
|
||||||
19.02.2017, 09:06 | 11 | |||||
А вот если использовать именованные
перечисления с неограниченной областью видимости (unscoped enumeration), то есть, enum'ы старого образца, без ключевого слова class , то всё работает, как часы:
0
|
Любитель чаепитий
|
||||||
19.02.2017, 10:37 | 12 | |||||
Во-первых, вы неправильно создаете
enum class в примере #4. Во-вторых, не то кастуете. )))
2
|
Модератор
|
|
19.02.2017, 10:58 | 13 |
Благодарю.
0
|
Любитель чаепитий
|
||||||
19.02.2017, 11:06 | 14 | |||||
Нет, они оба имеют значение SU6, то есть 0, в данном случае.
Вообще, такое объявление сродни такому:
Добавлено через 2 минуты Вообще, я забыл уже, что мы с тобой на ты, поэтому на вы обращался по привычке.
1
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
19.02.2017, 12:37 | 16 |
0
|
Модератор
|
|
19.02.2017, 12:50 | 18 |
rikimaru2013, как сказал поэт:
Сообщение от А.С. Пушкин
0
|
Croessmah
|
19.02.2017, 12:58
#19
|
0
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
19.02.2017, 13:05 | 20 |
только ради этих фраз в воскресенье с пивом в руке, запускаю студию, чтобы выступить в виде доместоса для этого кода!
0
|
19.02.2017, 13:05 | |
19.02.2017, 13:05 | |
Помогаю со студенческими работами здесь
20
.elf и для чего они нужны .clear() и .seekg() Для чего они нужны? Allocator_traits propagate_on_container_ - для чего они нужны Что такое саттелиты и для чего они нужны? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |