ProgrammatieSenior C++ Developer

Vertel over het mechanisme 'enum class' (scoped enums) in C++. Wat is het verschil met gewone enumeraties en waarom is het geïntroduceerd? Welke fouten zijn typisch bij de overstap van oude enums naar enum class?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

In C++11 werd het mechanisme 'scoped enums' geïntroduceerd — het sleutelwoord enum class.

Belangrijkste verschillen met klassieke enums:

  • De inhoud van enum class heeft zijn eigen scope, er is geen vervuiling van de globale naamruimte.
  • Er vindt geen impliciete conversie plaats van enumerators naar int (expliciete cast is vereist).
  • Het standaardtype van enum class is int, maar je kunt een ander type opgeven (bijvoorbeeld, enum class MyE : uint8_t { ... };).

Waarom is het nodig: Voor het verhogen van typeveiligheid, het voorkomen van naamconflicten, onjuiste vergelijkingen en expliciet beheer van opslag.

Voorbeeld:

enum Color { Red, Green }; Color c = Red; // Gewone enum, Red is globaal zichtbaar enum class State { Off, On }; State s = State::On; // Het moet State::On zijn

Je kunt niet schrijven:

enum class State { Off, On }; int x = State::On; // Fout! Alleen met cast int y = static_cast<int>(State::Off); // OK

Vraag met een valstrik

Waarom kan je geen logische vergelijkingen maken tussen waarden van verschillende enum classes, ook al zijn ze gelijk in naam en onderliggend type?

Antwoord:

Typeveiligheid: elke enum class is een apart type, zelfs als het onderliggende type hetzelfde is en de enumerators overeenkomen in naam. De compiler beschouwt ze als verschillende types en staat geen impliciete vergelijking toe.

Voorbeelden van echte fouten door gebrek aan kennis over de nuances van dit onderwerp.


Verhaal

Bij de overstap van enum naar enum class in een project voor machinebeheersing, vergaten ze een expliciete conversie toe te voegen bij het afdrukken van waarden in de log. De logs begonnen "vreemde" waarden te tonen (herkende State::On niet als nummer), wat het debuggen bemoeilijkte.


Verhaal

In een REST-service, na de migratie van gewone enums naar enum class, vergeleek de code waarden van verschillende enumeraties uit verschillende enum classes. De compiler stond dit niet toe, automatische tests konden niet meer worden opgebouwd.


Verhaal

In een auditsysteem verwarden ontwikkelaars de oude en nieuwe syntaxis — soms verklaarden ze per ongeluk enum class, maar gebruikten ze de enumerators zonder qualifier, waardoor de verkeerde code werd gecompileerd of linkfouten ontstonden door overeenkomende namen.