Last modified: September 25, 2024

This article is written in: 🇵🇱

Typ wyliczeniowy enum

Typ wyliczeniowy enum w C++ umożliwia tworzenie zmiennych mogących przyjmować tylko pewien, wstępnie określony zestaw wartości. Każda z tych wartości reprezentowana jest przez czytelną nazwę, co przyczynia się do zwiększenia czytelności kodu. Od C++11 wprowadzono enum class, który oferuje silniejsze typowanie i lepszą hermetyzację niż tradycyjne enum.

Tradycyjny enum

Tradycyjny enum pozwala na zdefiniowanie zestawu nazwanych stałych, które są domyślnie przypisane do wartości całkowitych zaczynając od zera. Możliwe jest również ręczne przypisanie wartości.

Przykład użycia tradycyjnego enum do reprezentacji dni tygodnia:

#include <iostream>

enum DzienTygodnia { Poniedzialek, Wtorek, Sroda, Czwartek, Piatek, Sobota, Niedziela };

int main() {
    DzienTygodnia dzien = Poniedzialek;  // Nie używamy tutaj specyfikatora DzienTygodnia::Poniedzialek

    switch (dzien) {
    case Poniedzialek:
        std::cout << "Dzisiaj jest poniedziałek." << std::endl;
        break;
    case Wtorek:
        std::cout << "Dzisiaj jest wtorek." << std::endl;
        break;
    // ... można kontynuować dla pozostałych dni
    default:
        std::cout << "Nieznany dzień tygodnia!" << std::endl;
    }

    return 0;
}

enum class

enum class, wprowadzony w C++11, różni się od tradycyjnego enum w kilku kluczowych aspektach:

Przykład wykorzystania enum class do reprezentacji kolorów:

#include <iostream>

enum class Kolor { Czerwony, Zielony, Niebieski };

int main() {
    Kolor kolor = Kolor::Czerwony;

    switch (kolor) {
    case Kolor::Czerwony:
        std::cout << "Wybrano czerwony." << std::endl;
        break;
    case Kolor::Zielony:
        std::cout << "Wybrano zielony." << std::endl;
        break;
    case Kolor::Niebieski:
        std::cout << "Wybrano niebieski." << std::endl;
        break;
    default:
        std::cout << "Blad!" << std::endl;
    }

    return 0;
}

Zalety użycia enum class w porównaniu do tradycyjnych enum:

Praktyczne zastosowania enum i enum class

I. Definiowanie stanów:

enum class Stan { Uruchomiony, Zatrzymany, Wstrzymany };

void zmienStan(Stan nowyStan) {
    // logika zmiany stanu
}

II. Przypisywanie wartości:

enum class Bledy : int {
    Brak = 0,
    Ostrzezenie = 1,
    Krytyczny = 2
};

Bledy blad = Bledy::Krytyczny;

III. Przykład z określeniem typu bazowego:

enum class Wielkosc : uint8_t { Mala, Srednia, Duza };

Wielkosc koszulka = Wielkosc::Srednia;

IV. Używanie w strukturach i klasach:

struct Samochod {
    enum class Typ { Sedan, Kombi, Hatchback };
    Typ typ;
};

Samochod samochod;
samochod.typ = Samochod::Typ::Sedan;

Spis Treści

    Typ wyliczeniowy enum
    1. Tradycyjny enum
    2. enum class
    3. Zalety użycia enum class w porównaniu do tradycyjnych enum:
    4. Praktyczne zastosowania enum i enum class