scoped enumeration
Főnév
scoped enumeration (tsz. scoped enumerations)
- (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égienumtí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
- Típusbiztonság: Nem lehet implicit módon
inttípusra konvertálni. - Névütközés elkerülése: A tagok csak
Típusnév::Tagformában érhetők el. - Explicit típus hozzárendelés: Alapértelmezés szerint
int, de lehet más is (unsigned,char,uint8_tstb.). - 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ítsto_stringfüggvényt vagy használjstd::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
- scoped enumeration - Szótár.net (en-hu)
- scoped enumeration - Sztaki (en-hu)
- scoped enumeration - Merriam–Webster
- scoped enumeration - Cambridge
- scoped enumeration - WordNet
- scoped enumeration - Яндекс (en-ru)
- scoped enumeration - Google (en-hu)
- scoped enumeration - Wikidata
- scoped enumeration - Wikipédia (angol)