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,
too_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();
}