Skip to content

Latest commit

 

History

History
160 lines (122 loc) · 3.28 KB

06-enums.md

File metadata and controls

160 lines (122 loc) · 3.28 KB

Podstawy C++

enum i enum class

Coders School

Typ wyliczeniowy

enum to po polsku typ wyliczeniowy. W C++11 wprowadzono także enum class zwany silnym typem wyliczeniowym.

Przykład

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.


Implementacja przykładu

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
};

Numeracja

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 vs enum class

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?


enum vs enum class

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

Użycie wartości z enum class

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