Данные · Контейнеры и алгоритмы

Перечисления

enum class вместо «магических» чисел и строк

~20 мин 5 шагов

После урока ты сможешь

  • Описывать набор вариантов через enum class
  • Обрабатывать варианты через switch так, чтобы компилятор ловил пропуски
  • Превращать перечисление в текст

Шаг 1 из 5

Магические числа

Заказ в интернет-магазине бывает новым, оплаченным, отправленным или доставленным. Как это хранить? Новички часто пишут так:

int status = 2;            // 2 — это что? отправлен? оплачен?
if (status == 3) { ... }   // а 3?
std::string state = "shiped";   // опечатка, и проверка тихо не сработает

Числа-коды без объяснения называют магическими числами: через месяц никто, включая автора, не помнит, что значит 2. Строки не лучше: опечатку компилятор не заметит.

Правильное решение — перечисление: тип, у которого есть только заранее перечисленные значения.

main.cpp
#include <print>
​
enum class OrderStatus {
    New,
    Paid,
    Shipped,
    Delivered,
};
​
int main() {
    OrderStatus status = OrderStatus::Paid;
    status = OrderStatus::Shipped;
​
    if (status == OrderStatus::Shipped) {
        std::println("Заказ в пути");
    }
}

OrderStatus::Shiped с опечаткой — ошибка компиляции. А status = 7 вообще не скомпилируется: у типа только четыре значения.