Типа Enum в C++

Понякога имаме нужда от текстово описание на множество стойности вместо да се чудим кое число какво означава в кода ни. Налага се в практиката. Тогава на помощ ни идва типа 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.