ProgramlamaKıdemli C++ Geliştirici

C++'de 'enum class' (kapsamlı enumeration) mekanizmasından bahsedin. Eski enumerationlardan farkı nedir ve neden tanıtılmıştır? Eski enum'dan enum class'a geçişte tipik hatalar nelerdir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

C++11'de 'kapsamlı enumeration' mekanizması tanıtıldı — enum class anahtar kelimesi.

Klasik enum'lardan temel farklar:

  • Enum class'ın içeriği kendi alanında (scope) yer alır, küresel isim alanını kirletmez.
  • Elemanların int'e örtük dönüşümü olmaz (açık bir dönüştürme gerekir).
  • Enum class'ın varsayılan tipi: int, ancak başka bir tür belirlemek mümkündür (örneğin, enum class MyE : uint8_t { ... };).

Neden gereklidir: Tür güvenliğini artırmak, isim çatışmalarını önlemek, hatalı karşılaştırmaları engellemek ve depolamada açık kontrol sağlamak için.

Örnek:

enum Color { Red, Green }; Color c = Red; // Normal enum, Red küresel olarak görünür enum class State { Off, On }; State s = State::On; // State::On belirtmek gerekir

Yazılamaz:

enum class State { Off, On }; int x = State::On; // Hata! Sadece dönüşüm ile int y = static_cast<int>(State::Off); // Tamam

Hileli Soru

Aynı isim ve temel türü olan farklı enum class'lar arasında mantıksal karşılaştırma neden yapılamaz?

Cevap:

Tür güvenliği: her enum class ayrı bir türdür, altındaki tür aynı olsa bile ve elemanlar isim açısından örtüşse bile. Derleyici bunları farklı türler olarak algılar ve örtük karşılaştırmalara izin vermez.

Konunun inceliklerine dair gerçek hata örnekleri.


Tarih

Makine kontrol projesinde enum'dan enum class'a geçerken, log değerlerini çıkarmada açık dönüşüm eklemeyi unuttular. Loglar "yabancı" değerler göstermeye başladı (State::On'ı sayı olarak tanımadı), bu da hata ayıklamayı zorlaştırdı.


Tarih

REST servisinde, sıradan enum'dan enum class'a geçiş sonrası, farklı enum class'lardan çeşitli enumeration değerlerini karşılaştırdı. Derleyici buna izin vermedi, otomatik testler derlenemedi.


Tarih

Denetim sisteminde geliştiriciler eski ve yeni sözdizimini karıştırdılar — bazen kazara enum class tanımladılar, ancak elemanları niteliklendirici olmadan kullandılar, sonuç olarak derlenen kod yanlış oldu veya çakışan isimler nedeniyle bağlantı hataları ortaya çıktı.