enum
to po polsku typ wyliczeniowy.
W C++11 wprowadzono także enum class
zwany silnym typem wyliczeniowym.
Załóżmy, że piszemy oprogramowanie do pralki. Chcielibyśmy utworzyć także interfejs zwracający numer błędu np:
- brak wody
- zbyt duże obciążenie
- problem z łożyskami
- blokada pompy
W celu warto użyć typu enum
lub lepiej - enum class
.
enum ErrorCode {
lack_of_water;
too_much_load;
bearing_problem;
block_of_pump;
};
// or better ↓
enum class ErrorCode {
lack_of_water;
too_much_load;
bearing_problem;
block_of_pump;
};
Typ enum
pod spodem numerowany jest od 0
do n - 1
, gdzie n
to liczba elementów.
Jeżeli chcemy nadać inne wartości musimy to zrobić ręcznie:
enum class ErrorCode {
lack_of_water = 333;
to_much_load; // will be 334
bearing_problem = 600;
block_of_pump; // will be 601
}
enum
od enum class
różni się głównie tym, że możemy niejawnie skonwertować typ enum
na int
(w końcu to typ wyliczeniowy).
Natomiast typ enum class
możemy skonwertować na int
, tylko poprzez jawne rzutowanie. Nie będziemy na razie omawiać rzutowania. Warto tylko
pamiętać, że robimy to wywołując:
int num = static_cast<int>(ErrorCode::lack_of_water)
W jakich innych przypadkach zastosujesz typ wyliczeniowy?
Druga różnica - dla enum
możemy mieć konflikt nazw, dla enum class
nie.
enum Color {
RED, // 0
GREEN, // 1
BLUE // 2
};
enum TrafficLight {
GREEN, // 0
YELLOW, // 1
RED // 2
};
auto lightColor = getColor();
if (lightColor == RED) { // 0 or 2?
stop();
} else {
go();
}
Aby uniknąć konfliktu nazw stosujemy enum class
.
enum class Color {
RED,
GREEN,
BLUE,
}
enum class TrafficLight {
GREEN,
YELLOW,
RED
}
auto lightColor = getColor();
if (lightColor == TrafficLight::RED) {
stop();
} else {
go();
}