Понякога имаме нужда от текстово описание на множество стойности вместо да се чудим кое число какво означава в кода ни. Налага се в практиката. Тогава на помощ ни идва типа enum. Името на типа идва от enumeration (изброяване). Той е целочислен тип. Можем да декларираме променливи от тип enum. И всяка такава променлива може да приема стойностите изброени в декларацията на този тип. Мислете за този тип като малка благинка, която прави кода ви по четим.
Деклариране
Enum е потребителски дефиниран тип данни, който съдържа краен набор от именувани стойности.
enum TypeName {
name1,
name2,
name3,
...
nameN
};- Тук TypeName е името на типа;
- В къдравите скоби изброяваме възможните стойности но с текст. Разделени със запетая;
- Завършваме конструкцията с ‘;’ както всяко изявление на C++;
Ето и примери:
enum SwitchPosition {
On, Off
};
enum DayOfWeek {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
};Какво се случва под капака?
Нищо особено. Компилтора прави следнаите декларации, като започва да дава стойности на изброените константи от 0. Инкрементира с +1:
enum SwitchPosition {
On = 0,
Off = 1
};
enum DayOfWeek {
Monday = 0,
Tuesday = 1,
Wednesday = 2,
Thursday = 3,
Friday = 4,
Saturday = 5,
Sunday = 6
};Използване
DayOfWeek today = Wednesday;
if (today == Wednesday) {
cout << "Среда е" << endl;
}Можете да задавате стойностите ръчно
// internet error codes
enum ErrorCode {
OK = 0,
NotFound = 404,
ServerError = 500
};Проблеми с enum
Много рядко, но при разсейване може да направите подобна грешка. Сравнявате две променливи декларирани с два различни вида enum.
Знаете, enum е целочислен тип. Така, че това което ви показах е наследство от преди 40 години. Да enum съществува от създаването на езика C. И долния двусмислен код ще се компилира.
enum Color { Red, Green, Blue };
enum Fruit { Apple, Banana, Orange };
Color c = Red;
Fruit f = Apple;
// ПРОБЛЕМ !!!
if (c == f) {
// това ще се изпълни
}В този код проблема е че, Red и Apple са от тип int. И нямаме начин да определим коя променлива е от тип Color или Apple. Тук инженерите на езика C++ отново са намерили решение. То се нарича enum class.
Enum class
Горещо ви препоръчвам да го използвате винаги и навсякъде, където мислите че е добре. Вижте следния код:
enum class Color { Red, Green, Blue };
enum class Fruit { Apple, Banana, Orange };
Color c = Color::Red;
Fruit f = Fruit::Apple;
int main() {
// ГРЕШКА ПО ВРЕМЕ НА КОМПИЛАЦИЯ
// ПРОМЕНЛИВИ ОТ РАЗЛИЧЕН ТИП
if (c == f) { }
}
При enum class посочваме и типа на променливата „тип :: стойност от изброения списък„. Това позволява на компилатора да измрънка при несъвместими типове по време на компилация. И няма да търсите грешка по време на изпълнение на програмата.
Винаги използвайте конструкцията enum class.