enumerated type (tsz. enumerated types)
enum
) egy olyan speciális típus C++-ban, amely nevesített konstansokat tartalmaz. Ezt főként akkor használjuk, ha egy változó csak bizonyos fix értékeket vehet fel, például hét napjai, irányok vagy státuszok.
enum
használatAz enum
segítségével egyedi konstansokhoz rendelhetünk numerikus értékeket.
#include <iostream>
enum Napok {Hetfo, Kedd, Szerda, Csutortok, Pentek, Szombat, Vasarnap};
int main() {
Napok ma = Hetfo;
if (ma == Hetfo) {
std::cout << "Ma hétfő van!\n";
}
return 0;
}
enum
a Napok
nevű típust definiálja.enum
belsejében lévő nevek (Hetfo
, Kedd
, stb.) implicit módon egész számokat kapnak (alapértelmezett kezdőérték: 0).ma
változó csak a Napok
típusú értékeket veheti fel.💡 Az alapértelmezett értékek: - Hetfo = 0
- Kedd = 1
- Szerda = 2
- …
Ha egy konkrét értéket szeretnénk beállítani:
enum Napok {Hetfo = 1, Kedd = 2, Szerda = 3};
Ekkor: - Hetfo = 1
- Kedd = 2
- Szerda = 3
enum
háttérben egész számokat használAz enum
értékei egész számokként viselkednek, így akár ki is írhatók:
std::cout << "Hetfo erteke: " << Hetfo << std::endl; // 0
std::cout << "Pentek erteke: " << Pentek << std::endl; // 4
📌 Figyelem! Az enum
típusok implicit módon átalakulhatnak egész számokká:
Napok n = Hetfo;
int szam = n; // szam = 0
De visszafelé már nem mindig biztonságos az átalakítás:
Napok n = static_cast<Napok>(3); // Lehetséges, de veszélyes!
Ezért inkább enum class
-t használjunk (erről később).
enum
értékek testreszabásaAz enum
értékeit manuálisan is beállíthatjuk, és azok nem feltétlenül kell növekvő sorrendben legyenek:
enum HibaKod {
Siker = 0,
Figyelmeztetes = 100,
Hiba = 500,
KritikusHiba = 1000
};
📌 Tipp: Ha a következő értéket nem adjuk meg, akkor automatikusan az előző érték +1 lesz.
enum
hatókör (Scoped Enum) – enum class
A hagyományos enum
-nak van néhány problémája: - Az értékek globálisan elérhetőek (pl. Hetfo
“szennyezheti” a névteret). - Az enum
automatikusan átalakulhat int-é. - Különböző enum
típusok nevei ütközhetnek.
Ezeket a problémákat az enum class
oldja meg:
enum class Napok {Hetfo, Kedd, Szerda, Csutortok, Pentek, Szombat, Vasarnap};
int main() {
Napok ma = Napok::Hetfo;
if (ma == Napok::Hetfo) {
std::cout << "Ma hétfő van!\n";
}
return 0;
}
📌 Mit változtatott meg az enum class
? 1. Nem globálisan elérhető neveket hoz létre, hanem Napok::Hetfo
formában kell hivatkozni rájuk. 2. Nem alakítható át automatikusan int-té, így a következő sor hibás lesz: cpp int x = Napok::Hetfo; // Hibás!
Ha mégis szükségünk van az értékére, akkor explicit módon kell konvertálnunk:
int x = static_cast<int>(Napok::Hetfo); // OK
enum class
és adattípusokAz enum class
lehetővé teszi, hogy az enum
mögöttes típusa ne csak int
, hanem más is lehessen:
enum class Allapot : unsigned int {
Kezdes = 1,
Futas = 2,
Leallas = 3
};
Itt az enum
értékek unsigned int
típusúak lesznek, ami memóriában is hatékonyabb lehet.
A switch
kiválóan működik enum
-mal:
#include <iostream>
enum class Szinek {Piros, Zold, Kek};
void szinKiir(Szinek szin) {
switch (szin) {
case Szinek::Piros:
std::cout << "Piros\n";
break;
case Szinek::Zold:
std::cout << "Zöld\n";
break;
case Szinek::Kek:
std::cout << "Kék\n";
break;
default:
std::cout << "Ismeretlen szín\n";
}
}
int main() {
Szinek s = Szinek::Zold;
szinKiir(s);
return 0;
}
enum
iterálásaC++ alapból nem támogatja az enum
típusok egyszerű iterálását, de segíthetünk rajta:
#include <iostream>
enum class Gyumolcs {Alma, Korte, Szilva, Barack};
int main() {
for (int i = static_cast<int>(Gyumolcs::Alma); i <= static_cast<int>(Gyumolcs::Barack); ++i) {
std::cout << "Gyümölcs index: " << i << std::endl;
}
return 0;
}
💡 Jobb megoldás: Ha sokat iterálunk, használhatunk std::array
-t vagy std::vector
-t.
Tulajdonság | Hagyományos enum
|
enum class
|
---|---|---|
Globális névtérszennyezés | Igen | Nem |
Automatikus int konverzió
|
Igen | Nem |
Biztonságos típuskezelés | Nem | Igen |
switch támogatás
|
Igen | Igen |
Iterálás | Nem natív módon | Nem natív módon |
Az enum class
az ajánlott verzió, mert típusbiztonságos és jobban olvasható.