Typ wyliczeniowy enum w C++
Typ wyliczeniowy enum w C++ daje programiście bardzo dużo ciekawych możliwości, a co najważniejsze rozwiązuje wiele problemów na jakie można natrafić podczas tworzenia oprogramowania. Takim podstawowym zastosowaniem typu wyliczeniowego enum jest na przykład możliwość bardzo sprawnego wysyłania argumentów do danej funkcji, które na dodatek są sprawdzane przez kompilator (nie ma możliwości wysłania innego typu argumentu niż ten, który został zdefiniowany przez programistę). Zobaczmy na przykładzie jak definiuje się typ enum:
enum nazwa_typu { lista_wyliczeniowa };
enum nazwa_typu { lista_wyliczeniowa };
Powyżej zdefiniowaliśmy nowy typ wyliczeniowy o nazwie co_robic. Oczywiście skoro co_robic jest typem to możemy tak jak w przypadku innych typów takich jak: int, char czy string zdefiniować odpowiednią zmienną:
co_robic no_wlasnie_co;
I tutaj pojawia się pytanie: co do tak zdefiniowanej zmiennej można zapisać? Oczywiście możemy tutaj przypisać tylko i wyłącznie jedną z pozycji zdefiniowaną na liście wyliczeniowej:
no_wlasnie_co = start; //ok, masz zacząć działać no_wlasnie_co = idz; //ok, masz zacząć iść no_wlasnie_co = stop; //ok, masz się zatrzymać
Zabronione są między innymi takie operacje:
no_wlasnie_co = 10; //to jest błąd!
Popatrzmy teraz na trochę inny przykład użycia typu wyliczeniowego enum:
enum operacjeNaTekstach { wypisz, zapisz, skasuj = 8, cosTam, nadpisz = wypisz + zapisz //typ wyliczeniowy enum jest typem arytmetycznym więc czemu by nie dodać dwóch liczb? };
Jak widać do niektórych pozycji na liście wyliczeniowej nie przypisaliśmy liczb. Co zatem będą one zawierać?
- wypisz będzie miało przypisane 0. Dlaczego? Ponieważ, jeżeli nie została podana żadna inna liczba to wyliczanie zaczynamy od 0,
- zapisz będzie zawierać 1, bo po 0 bierzemy następną cyfrę czyli 1,
- skasuj jak widać zawiera 8,
- cosTam będzie miało przypisane 9, bo po 8 kompilator weźmie następną liczbę,
- natomiast nadpisz ma zapisaną liczbę 0 + 1 czyli 1.
Należy pamiętać, że typ wyliczeniowy enum jest typem arytmetycznym, a więc możliwe są między innymi takie operacje:
enum jakisTyp { nadpisz = wypisz + zapisz };
Oczywiście typ wyliczeniowy nie musi zawierać jakiejś nazwy:
enum { wypisz, zapisz, skasuj = 8, cosTam };
Należy jednak pamiętać, że w tym przypadku nie będziemy mogli definiować nowych obiektów ponieważ nie znamy nazwy typu jakim chcemy się posłużyć.
Przykładowy program korzystający z typu wyliczeniowego bez nazwy:
#include <iostream> using namespace std; enum { wypisz, zapisz, skasuj = 8, cosTam, nadpisz = wypisz + zapisz //typ wyliczeniowy enum jest typem arytmetycznym więc czemu by nie dodać dwóch liczb? }; int main() { cout << wypisz; //wypisze 0 cout << endl; cout << skasuj; //wypisze 8 return 0; }
Na początku tego artykułu wspomniałem iż typ wyliczeniowy można zastosować na przykład do przesyłania pewnych danych do funkcji. Poniżej więc przedstawiam przykładowy program, który wykorzystuję tę własność typu wyliczeniowego:
include <iostream> using namespace std; enum { wypisz, zapisz, skasuj = 8, cosTam, nadpisz = wypisz + zapisz //typ wyliczeniowy enum jest typem arytmetycznym więc czemu by nie dodać dwóch liczb? }; void jakasFunkcja(int liczba) { cout << liczba; //wypisze 8 } int main() { jakasFunkcja(skasuj); return 0; }
Fot: Samsung, Program „Mistrzowie kodowania”.