Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.87/89: Рейтинг темы: голосов - 89, средняя оценка - 4.87
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562

Перечисления (enum): для чего они нужны? Как, когда и какими перечислениями уместнее пользоваться?

18.02.2017, 21:12. Показов 19969. Ответов 40

Студворк — интернет-сервис помощи студентам
Предположим есть такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <iomanip>
#include <Windows.h>
 
enum airplanes {SU6, SU29, SU34}; // После фигурных скобок могут идти переменные,
                                 // В книге об этом ничего не говорится, но будет интересно узнать, как ими пользваться.
    int main (){
 
        enum airpalnes how; // Как правильно использовать?
 
        int model(0);
 
        switch (model){
        case (SU6):  break;
        case (SU29): break;
        case (SU34): break;
 
        }
 
 
 
        system ("pause");
        return 0;
    }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.02.2017, 21:12
Ответы с готовыми решениями:

Для чего нужны сужающие преобразования как они работают и на сколько они важны?
Я читаю одну книгу и застрял на одной теме &quot;Преобразования&quot;, и там есть такой вот код double х {2.7}; int у {х}; // Ошибка : double...

Что за драйвера такие, для чего они и нужны ли они вообще?
Что за драйвера такие, для чего они и нужны ли они вообще? 1 Intel SATA Preinstall driver (For AHCI / RAID Mode) Note: Press F6...

Зачем нужны перечисления enum?
Зачем нужны перечисления enum? Почему нельзя просто использовать массив? Объясните в чем плюсы перечислений.

40
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
19.02.2017, 13:12
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
в воскресенье с пивом в руке, запускаю студию

Лишь только вы подумали "Какая-то фигня", в течение минуты ожидайте меня.
Я напишу, гарантия на код мой ровно год. И если код сломается, сигнал "ТЫЖ" и Тыж придёт.
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
19.02.2017, 13:15
Цитата Сообщение от Photofenix Посмотреть сообщение
enum airplanes {SU6, SU29, SU34} a,b ;
Photofenix, эта запись только указывает тип переменных
C++
1
2
какой_то_тип  a, b;
struct S { int n;  int m; }  c, d;
Цитата Сообщение от GbaLog- Посмотреть сообщение
Нет, они оба имеют значение SU6, то есть 0, в данном случае.
GbaLog-, Photofenix, это зависит от того, глобальные переменные или нет. Значения локальных a, b здесь не задаются.
Миниатюры
Перечисления (enum): для чего они нужны? Как, когда и какими перечислениями уместнее пользоваться?  
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
19.02.2017, 13:20
.
Alex5, а по теме? Название темы: Перечисления (enum): для чего они нужны? Как, когда и какими перечислениями уместнее пользоваться?
.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
19.02.2017, 14:05
enum.h
https://github.com/aantron/better-enums

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <string>
#include "enum.h"
 
BETTER_ENUM( Airplane, int
    , SU6
    , SU29
    , SU34
);
 
int main()
{
    do 
    { 
        std::cout << "Enter a model of the airplane ( ";
        for( const auto& it : Airplane::_names() )
            std::cout << it << " ";
        std::cout << ")" << std::endl;
 
        std::string plane;
        std::getline( std::cin, plane );
 
        const auto optionalPlane = Airplane::_from_string_nocase_nothrow( plane.c_str() );
        if( optionalPlane )
        {
            Airplane planeEnum = *optionalPlane;
 
            std::cout << "Was entered " << planeEnum._to_string() << " model of airplane " << std::endl;
        }
        else
        {
            std::cout << "Incorrect input" << std::endl;
        }
 
        std::cout << std::endl;
    }
    while( true );
}
Добавлено через 44 минуты
GbaLog-, gru74ik, ну что там ребята?! Я вам просто так не прощу, что я в священное для программистов воскресенье кодил из-за вас.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
19.02.2017, 14:32
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
ну что там ребята?!
Я эту либу не знаю, поэтому спрошу, что будет, если я введу неверное значение?
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
19.02.2017, 22:21
GbaLog-, я у вас тоже самое спросил выше, что будет при enum {A, B, C} и cin где ввели 18243 и вы мне не ответили... . Только умничали))
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
20.02.2017, 05:40
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
я у вас тоже самое спросил выше
Нет, вы написали:
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
плохо пахнит)))
Это никак не может являться вопросом.
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
что будет при enum {A, B, C} и cin где ввели 18243
Переход в default, я думаю.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
20.02.2017, 06:38
rikimaru2013, ты как-то всё совсем в другое русло перевёл. Библиотечный enum, это, конечно, прекрасно, но как это кореллирует с беседой о возможностях, встроенных в язык? Речь-то шла об перечислениях, которые нам доступны "из коробки". И как это кореллирует с заявлением:
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
enum зло, используйте enum class
?
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
20.02.2017, 10:49
gru74ik, снова мимо! Много букв и нету твоего мнения, почему enum лучше enum class.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
20.02.2017, 11:15
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
что будет при enum {A, B, C} и cin где ввели 18243
c С++17 - то же самое, что и при enum class.
8.6.4.3.9:
...
C++
1
2
enum class Handle : uint32_t { Invalid = 0 };
Handle h { 42 };    // OK
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
20.02.2017, 11:21
avgoor, я же не Эксперт в С++ как некоторые в этой теме, но всё же что говорят в этой теме http://stackoverflow.com/quest... enum-class
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
20.02.2017, 11:24
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
почему enum лучше enum class.
Это ж ты сказал, что enum class лучше, чем enum. Я же просто привёл примеры, некоторые работают, некоторые нет. Я по-моему довольно ясно дал понять, что просто не умею работать с enum class, И хотел бы увидеть красивую работу с ним в твоём исполнении, раз уж ты заявил
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
enum зло, используйте enum class
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
20.02.2017, 11:25
rikimaru2013, По сравнению с тем, что написано в стандарте с++17, мне абсолютно по фиг, что написано на каком-то форуме в 14 году.
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
20.02.2017, 11:36
avgoor, обновил свой стандарт с 2014 на 2017 - спасибо)

Otherwise, if T is an enumeration with a fixed underlying type (7.2), the initializer-list has a single
element v, and the initialization is direct-list-initialization, the object is initialized with the value
T(v) (5.2.3); if a narrowing conversion is required to convert v to the underlying type of T, the program
is ill-formed.
Возможно у меня проблемы с английским, но в моем примере что будет при enum {A, B, C} и cin где ввели 18243 не будет сужающего преобразования ведь по умолчанию enum имеет underlying type int, как и числовой литерал 18243.

Да и в вашем коде нету ill-formed, ведь данный пункт про преобразование int(42) к enum : unsigned char является ill-formed - потому, что каст с int к unsigned char называется именно narrowing conversion, но не как не int к int как в моем случаи, и не int к uint32_t как в вашем.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
20.02.2017, 11:50
rikimaru2013, Мысль была вот в чем. Во многих местах, где традиционно использовались enum-ы использовать enum class было не удобно. Поэтому, возможно, многие в этой теме возмутились вашими словами. И поэтому в 17 стандарте появились эти изменения.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
20.02.2017, 12:05
avgoor, что-то вы не ответили на вопросы - ну да ладно) Я не гордый - забуду!) А про enum - вы как считаете: для типа самолётов нужен enum или enum class ?
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
20.02.2017, 12:13
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
вы как считаете: для типа самолётов нужен enum или enum class ?
Ни то ни другое. Хардкодить данные, которые могут меняться со временем - моветон.
Цитата Сообщение от rikimaru2013;1013[quote="rikimaru2013 Посмотреть сообщение
что-то вы не ответили на вопросы
Какие вопросы? Поиск по этой теме символа "?" дал 2 вопроса от вас:
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
вы понимаете, что enum class ввели, чтобы решать какие-то проблемы?
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
ну что там ребята?! Я вам просто так не прощу
Прям не знаю, что на них ответить.
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
20.02.2017, 12:18
avgoor, согласен с вами, для сериализации/десериализации enum нужно использовать только строки с корректной обработкой устаревших данных(обратная совместимость).

А вопросы: значит у солдатов нет вопросов) Проверил через символ "?" - действительно нету вопросов) Я так никогда не заблуждался - спасибо)
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
20.02.2017, 12:46
Цитата Сообщение от Lyosha12 Посмотреть сообщение
постоянно указывать область, из которой брать переменную - немного накладно
Ну да, куда лучше префиксы к названия в enum, красота!

Я не буду приводить кучу довод "за" enum class, расскажу лучше реальный случай из практики, как раз на прошлой неделе было.

Жила-была в проекте замечательная функция, которая разбирала xml и возвращала код ошибки. По всем феньшуям, список ошибок был оформлен как enum (но не enum class). Была функция удобной и нужной. И расползлись вызовы её по всему проекту. И в каких-то местах обработка результата, возвращаемого функцией шла через switch-case, в каких-то записывалась в int и передавалась другим функциям, а в каких-то нужно было определить тип ошибки и бралось смещение (+ константа). Более того, некоторые ошибки нужно было залогировать и были написаны два массива, один содержал развёрнутое текстовое описание ошибок, другой короткое. Разумеется, соответствие бралось по индексу массива (удобно же, и без преобразований). Но вот понадобилось добавить новый вид ошибки, казалось бы - делов? Ан-нет, пойди найди все места, где добавление ничего не сломает. Был бы поиск по scope как у enum class, была б задача проста, а тут надо все int-ы перебрать, да никого не обидеть. Вообщем растянулась правка с 5 минут на 5 часов, да и то коммит делался с небольшим опасением.
Кликните здесь для просмотра всего текста
Хотелось бы закончить фразой "Таска ложь, да в ней намёк..." но, к сожалению, что было то было. Всем кто дочитал до конца низкий поклон


Если кому интересны все плюсы и минусы enum class (а также пример когда enum предпочтительнее), прочтите соответствующую главу у Майерса в "42 рекомендации". Не охота переписывать всё то, что сказано в книге, да ещё и своим колхозным языком.
3
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,857
Записей в блоге: 15
04.07.2020, 22:32
Спасибо stake-k26, от него узнал, что с помощью enum, можно заменять макросы. Типа
C
1
2
#define N 3
#define M 3
можно заменить на enum {N=3, M=3};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.07.2020, 22:32

Struts для чего они нужны?
Привет всем! Сразу прошу не бить ногами, если кому-то вопрос показался идиотским. Но дело в том, что уже некоторое время пытаюсь...

.elf и для чего они нужны
Собственно сабж Почитал Вики, как-то для новичка не очень много прояснилось И объясните еще пожалуйста разницу с ехе

.clear() и .seekg() Для чего они нужны?
Здравствуйте! Изучал код и увидел 2 интересные строки, начал гуглить, но внятного ответа не нашел, или же просто не могу понять. Объясните...

Allocator_traits propagate_on_container_ - для чего они нужны
В std::allocator_traits есть такие определения как propagate_on_container_copy_assignment, propagate_on_container_move_assignment и...

Что такое саттелиты и для чего они нужны?
Что такое саттелиты и для чего они нужны? Какую роль они играют?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru