Ibland kanske man vill använda någon form av namngivna konstanter för att representera något,
t.ex. färger. Vi kan då t.ex. deklarera ett antal variabler av typen int och
ge dem unika värden. Sedan kan vi använda dessa variabler för att t.ex. indexera en vektor med
färger. Låter klumpigt, eller hur? Det finns ett lättare sätt att åstadkomma följder av tal i C++,
nämligen med enumereringar. Allmänt definieras en enumerering på följande sätt:
enum namn { element1, ..., elementN }; |
En enumerering innehåller en mängd element, som kommer att enumerera börjande från 0. På så vis
associeras varje element med ett unikt värde. En enumerering ges även ett namn, så att man kan skapa
variabler med enumereringen som datatyp. Ett exempel på en enumererad regnbåge:
enum Color { Black, White, Red, Orange, Yellow, Green, Blue, Purple, Indigo }; |
På engelska för omväxlings skull. Här har vi nu definierat en ny datatyp
Colors, och vi kan deklarera variabler av denna typ om vi vill:
Color EnFarg;
Color Regnbage [5]; |
Denna datatyp är dock speciell, i och med att variabler av en enumerad datatyp endast kan innehålla
de värden som gavs vid enumereringens definition. Så i vårt exempel kan
EnFarg ges alla värden från Black till
Indigo. En variabel tilldelas ett värde helt normalt:
Farg = Red;
Regnbage [0] = Red;
Regnbage [1] = Orange; |
De enda operationer som är tillåtna med enumereringar är tilldelning och jämförelse. Man kan
t.ex. inte addera eller subtrahera enumereringar. Man kan även endast tilldela enumererade variabler
värden som finns i enumereringen. Följande är alltså inte tillåtet:
Color Farg;
Farg = 10; // fel datatyp
Farg = Gray; // ingen sådan färg i enumereringen |
Man kan tilldela en enumerering en int om man först konverterar den till en
enumerering:
Color Farg;
Farg = (Color)3; // ok, blir 'Orange'
Farg = (Color)8; // ok, blir 'Indigo'
Farg = (Color)45; // fel, ingen sådan färg |
Det sista exemplet är illegalt, eftersom det inte finns så många värden i enumereringen. Som redan
tidigare nämnts så är en enumerering i grund och botten en int, därför är
ovanstående konvertering möjlig. Man kan ge enumereringar andra värden än sådana som börjar från 0
och ökar med 1 per värde. Det görs genom att skriva värdet efter enumereringselementet. Om man
t.ex. vill börja en serie från 10 kan man göra följande:
enum Bilar { Opel = 10, BMW, Mercedes, Ford }; |
Nu får BMW värdet 11, Mercedes värdet 12 och
Ford värdet 13. Man kan även ge varje element ett unikt värde, men de bör
vara i stigande ordning när man går högerut. Man kan även ge flera element samma värde om det finns
behov för detta.
enum KursBitar { Forelasning = 1, Tent = 2, RO = 4, Kompendium = 8, Studerande = 16 };
enum Error { Critical = 0, Fatal = 0, Serious, Warning, Ok }; |
Ovan har vi skapat en binär enumerering vars värden kan kombineras med
t.ex. or för att på så vis kombinera flera flaggor i ett enda
int-värde. Användingsområdena för enumereringar är mycket varierande. Ofta
används de där man vill ha en egen datatyp som kan användas som en int (t.ex. för
att indexera vektorer), eller där man vill ha en datatyp som endast kan ha ett fåtal fördefinierade
värden.