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

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

18.02.2017, 21:12. Показов 19235. Ответов 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
8216 / 5047 / 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,852
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru