Перечисления
enum class вместо «магических» чисел и строк
После урока ты сможешь
- Описывать набор вариантов через enum class
- Обрабатывать варианты через switch так, чтобы компилятор ловил пропуски
- Превращать перечисление в текст
Шаг 1 из 5
Магические числа
Заказ в интернет-магазине бывает новым, оплаченным, отправленным или доставленным. Как это хранить? Новички часто пишут так:
int status = 2; // 2 — это что? отправлен? оплачен?
if (status == 3) { ... } // а 3?
std::string state = "shiped"; // опечатка, и проверка тихо не сработает
Числа-коды без объяснения называют магическими числами: через месяц никто, включая автора, не помнит, что значит 2. Строки не лучше: опечатку компилятор не заметит.
Правильное решение — перечисление: тип, у которого есть только заранее перечисленные значения.
#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 вообще не скомпилируется: у типа только четыре значения.