scoped enumeration

Üdvözlöm, Ön a scoped enumeration szó jelentését keresi. A DICTIOUS-ban nem csak a scoped enumeration szó összes szótári jelentését megtalálod, hanem megismerheted az etimológiáját, a jellemzőit és azt is, hogyan kell a scoped enumeration szót egyes és többes számban mondani. Minden, amit a scoped enumeration szóról tudni kell, itt található. A scoped enumeration szó meghatározása segít abban, hogy pontosabban és helyesebben fogalmazz, amikor beszélsz vagy írsz. Ascoped enumeration és más szavak definíciójának ismerete gazdagítja a szókincsedet, és több és jobb nyelvi forráshoz juttat.

Főnév

scoped enumeration (tsz. scoped enumerations)

  1. (informatika) Az enum class (vagyis scoped enumeration, magyarul hatókörrel rendelkező felsorolási típus) a C++11-től kezdve bevezetett nyelvi elem, amely a régi enum típust biztonságosabbá, modernebbé és modulárisabbá teszi.



🧠 Alapfogalom: Mi az az enum class?

Az enum class egy típusbiztos, hatókörhöz kötött felsorolási típus, amellyel konstansokat lehet definiálni egy típus alá szervezve. A célja, hogy elkerülje a régi enum típus problémáit: névütközést, implicit konverziót int típusra, és gyenge típusellenőrzést.

Szintaxis:

enum class Szin {
    Piros,
    Zold,
    Kek
};

Ebben a példában Szin::Piros, Szin::Zold, és Szin::Kek érvényes tagok. Nem lehet őket simán Piros néven elérni, mint a régi enum esetén.



🔁 Összehasonlítás a régi enum-mal

Klasszikus enum:

enum Szin {
    Piros,
    Zold,
    Kek
};

Szin s = Piros;       // működik
int i = Piros;        // ez is működik (de veszélyes!)

enum class:

enum class Szin {
    Piros,
    Zold,
    Kek
};

Szin s = Szin::Piros;  // működik
int i = Szin::Piros;   // fordítási hiba!

✅ Előnyök

  1. Típusbiztonság: Nem lehet implicit módon int típusra konvertálni.
  2. Névütközés elkerülése: A tagok csak Típusnév::Tag formában érhetők el.
  3. Explicit típus hozzárendelés: Alapértelmezés szerint int, de lehet más is (unsigned, char, uint8_t stb.).
  4. Modularitás: Könnyebben karbantartható, különösen nagy projektekben.



🧾 Példák

Egyszerű enum class

enum class Allapot {
    Elindult,
    Futo,
    Leallt
};

Allapot a = Allapot::Futo;

Ciklus enum class-sel

for (int i = static_cast<int>(Allapot::Elindult); i <= static_cast<int>(Allapot::Leallt); ++i) {
    std::cout << i << "\n";
}

Switch-cases használat

switch (a) {
    case Allapot::Elindult:
        std::cout << "Elindult\n";
        break;
    case Allapot::Futo:
        std::cout << "Fut\n";
        break;
    case Allapot::Leallt:
        std::cout << "Leállt\n";
        break;
}

🔒 Típuskonverzió

enum class tagokat nem lehet közvetlenül int-re konvertálni:

enum class Nap {
    Hetfo = 1, Kedd, Szerda
};

int n = static_cast<int>(Nap::Kedd);  // csak így lehet!

🛠️ Alapértelmezett tárolási típus

Alapértelmezés szerint int, de megadható más típus is:

enum class Valasz : uint8_t {
    Igen = 1,
    Nem = 2
};

Ez hasznos, ha memóriát akarunk spórolni (pl. beágyazott rendszerekben).



🧩 Használati területek

  • Állapotgépek (State machine)
  • Menüpontok
  • Konfigurációs módok
  • I/O vezérlés
  • Hibaállapotok leírása



🧪 Unit test kompatibilitás

A enum class típus könnyen összehasonlítható és tesztelhető:

REQUIRE(motor.getAllapot() == Allapot::Futo);

🔄 Összefoglalás

Tulajdonság enum enum class
Típusbiztonság
Implicit int konv. ❌ (csak cast-tal)
Névütközés veszély
Szintaktikai forma Piros Szin::Piros
Alapértelmezett típus int int (vagy megadható)



👨‍💻 Tippek

  • Használj enum class-t, ha új kódot írsz — ez a jövőbiztos megoldás.
  • Kerüld a klasszikus enum-ot, hacsak nincs kompatibilitási kényszered (pl. C API-k).
  • Ha enum class értékeket szeretnél kiíratni szövegként, készíts to_string függvényt vagy használj std::map.



🔚 Konklúzió

Az enum class a modern C++ egyik fontos újítása, amely biztonságosabb és strukturáltabb kódot eredményez. Minden olyan esetben, amikor korábban enum-ot használtunk, ma már ajánlott enum class-t alkalmazni, mert:

  • Minimalizálja a hibalehetőséget
  • Könnyebben olvasható és karbantartható
  • Jobban illeszkedik az objektum-orientált szemléletbe