Rajattu enum class
Tyyppiturvalliset luettelot
Rajattu enum class on ilmainen C++ Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu C++ Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C++ Academy-kurssilla on yhteensä 4 oppituntia.
Tavalliset enum-tyypit vuotavat nimet
Perinteinen C-tyylinen enum tuo nimensä ympäröivään näkyvyysalueeseen ja muuntuu hiljaisesti int-tyypiksi. Tämä tekee nimien yhteentörmäyksistä ja tahattomista vertailuista helppoja.
- enum class ratkaisee molemmat ongelmat.
- Arvot ovat rajattuja ja vahvasti tyypitettyjä.
#include <iostream>
enum Color { Red, Green, Blue };
int main() {
Color c = Green;
int x = c; // implicit conversion to int
std::cout << x << "\n";
}Rajatun enum-tyypin määrittäminen
Lisätkää class- tai struct-avainsana, jotta luotte rajatun enum-tyypin. Tämän jälkeen jokainen arvo on määritettävä enum-tyypin nimellä.
#include <iostream>
enum class Color { Red, Green, Blue };
int main() {
Color c = Color::Green;
if (c == Color::Green) std::cout << "green\n";
}Ei implisiittistä muunnosta
Rajattu enum-tyyppi ei muunnu implisiittisesti int-tyypiksi. Tämä estää virheet, joissa enum-tyyppiä käytetään vahingossa aritmetiikassa.
- Saadaksenne numeron teidän on käytettävä eksplisiittistä muunnosta.
#include <iostream>
enum class Color { Red, Green, Blue };
int main() {
Color c = Color::Blue;
int n = static_cast<int>(c); // explicit
std::cout << n << "\n"; // prints 2
}Taustalla oleva tyyppi
Oletusarvoinen taustalla oleva tyyppi on int, mutta voitte valita pienemmän tai tietyn kokonaislukutyypin tilan säästämiseksi tai protokollan mukaisesti.
#include <iostream>
#include <cstdint>
enum class Status : std::uint8_t { Ok = 0, Warn = 1, Error = 2 };
int main() {
Status s = Status::Warn;
std::cout << static_cast<int>(s) << "\n";
}Mukautetut arvot
Voitte määrittää enum-arvoille eksplisiittiset arvot. Eksplisiittistä arvoa seuraavat arvot jatkavat laskemista siitä eteenpäin.
#include <iostream>
enum class Http { Ok = 200, NotFound = 404, ServerError = 500 };
int main() {
Http h = Http::NotFound;
std::cout << static_cast<int>(h) << "\n";
}Enumin käsittely switch-lauseella
Enum-tyypit ovat parhaimmillaan switch-lauseissa. Jokaisen tapauksen luetteleminen tekee tarkoituksesta selvän ja antaa kääntäjälle mahdollisuuden varoittaa puuttuvista tapauksista.
#include <iostream>
enum class Dir { North, East, South, West };
const char* name(Dir d) {
switch (d) {
case Dir::North: return "N";
case Dir::East: return "E";
case Dir::South: return "S";
case Dir::West: return "W";
}
return "?";
}
int main() { std::cout << name(Dir::East) << "\n"; }Enum-tyypit funktioargumentteina
Rajatun enum-tyypin välittäminen ilmaisee tarkoituksen paljon paremmin kuin paljaan int- tai bool-arvon välittäminen. Kääntäjä varmistaa, että käytössä ovat vain kelvolliset enum-arvot.
#include <iostream>
enum class Align { Left, Center, Right };
void render(const char* text, Align a) {
std::cout << text << " aligned " << static_cast<int>(a) << "\n";
}
int main() { render("Hi", Align::Center); }Enum-arvojen vertaileminen
Rajatut enum-tyypit tukevat suoraan operaattoreita == ja !=. Myös vertailuoperaattorit (<, >) toimivat, koska arvot ovat järjestettyjä.
#include <iostream>
enum class Level { Low, Medium, High };
int main() {
Level l = Level::High;
std::cout << (l > Level::Low ? "above low\n" : "low\n");
}Käsitteellinen läpikäynti
Enum-tyypit eivät ole automaattisesti iteroitavia, mutta yleinen tapa on muuntaa arvot taustalla oleviksi kokonaisluvuiksi. Käyttäkää päätearvoa, kuten Count, alueen määrittämiseen.
#include <iostream>
enum class Coin { Penny, Nickel, Dime, Count };
int main() {
for (int i = 0; i < static_cast<int>(Coin::Count); ++i)
std::cout << i << " ";
std::cout << "\n";
}Miksi tyyppiturvallisuus on tärkeää
Kahta toisiinsa liittymätöntä rajattua enum-tyyppiä ei voi koskaan yhdistää vahingossa, vaikka molemmissa olisi arvo nimeltä None. Kääntäjä käsittelee niitä erillisinä tyyppeinä.
#include <iostream>
enum class Fruit { None, Apple };
enum class Tool { None, Hammer };
int main() {
Fruit f = Fruit::None;
// Tool t = f; // would NOT compile
std::cout << (f == Fruit::None) << "\n";
}Milloin tavallisia enum-tyyppejä käytetään
Tavallisia enum-tyyppejä esiintyy edelleen vanhoissa rajapinnoissa ja bittilippukoodissa, jossa implisiittinen int-muunnos on kätevä. Uudessa koodissa suosikaa enum class -tyyppiä, ellei teillä ole erityistä syytä toimia toisin.
Pikatarkistus
Testatkaa, miten hyvin ymmärrätte rajattuja enum-tyyppejä.
Kertaus
Opitte rajatuista enum-tyypeistä:
enum classrajaa arvot ja estää implisiittisen int-muunnoksen.- Käyttäkää
static_cast<int>-muunnosta numeron lukemiseen. - Valitkaa taustalla oleva tyyppi käyttäen määrettä
: type. - Suosikaa
enum class-tyyppiä tyyppiturvalliseen ja itsensä dokumentoivaan koodiin.
Opi C++ tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 51
- Oppitunnit
- 203
Usein kysytyt kysymykset
Onko oppitunti ”Rajattu enum class” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa C++ Academy-oppimispolun 3 oppituntia, myös oppitunnin “Rajattu enum class”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. C++ Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Rajattu enum class”?
Tyyppiturvalliset luettelot Harjoittelet C++ Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni C++ Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin C++ Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”Rajattu enum class”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä C++ Academy-oppitunnilla?
Kyllä. Jokainen C++ Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Rajattu enum class
- Unionit ja niiden riskit
- std::variant
- std::visit