Hjem Personlig finansiering Sterkt Typed Enumerations i C ++ - dummies

Sterkt Typed Enumerations i C ++ - dummies

Video: Zeitgeist Addendum 2025

Video: Zeitgeist Addendum 2025
Anonim

Programmering handler om lesbarhet. Det er vanskelig (faktisk det er umulig) å skrive og vedlikeholde et program som du ikke kan lese. En del av å lese en kildekodeoppføring er å forstå hva tallene som brukes i programmet representerer. Den mest grunnleggende hjelpen som C ++ gir, er den allestedsnærværende #definen, som i følgende ofte omtalte eksempel:

#define PI 3. 141592653589793

Denne løsningen er greit for individuelle verdier, selv om det lider av at #define mekanismen er ikke (strengt tatt) en del av C / C ++ siden preprosessoren kjører før kompilatoren. Som svar på dette introduserte C ++ 2011 et konstant uttrykk konstruksjon:

constexpr lang dobbel PI = 3. 141592653589793;

Constexpr-nøkkelordet bringer konstanter inn i C ++-teltet. Denne PI har en ekte type, som andre C ++-variabler. C ++ kan generere feilmeldinger med PI som gir mye mer mening enn de som involverer 3. 14159.

Konstantuttrykk er bra for individuelle konstante verdier, men ofte representerer konstanter sett av ting i stedet for naturlige konstanter, som i følgende eksempel:

#define DC_OR_TERRITORY 0 #define ALABAMA 1 #define ALASKA 2 #define ARKANSAS 3 // … og så videre …

Formentlig blir disse konstantene brukt til å identifisere statene som kanskje brukes som en indeks i en rekke statobjekter eller som en verdi i en database et sted.

C ++ har lenge hatt en forbedret mekanisme for å definere disse typer konstanter - oppregningen:

enum STATE {DC_OR_TERRITORY, // blir 0 ALABAMA, // får 1 ALASKA, // får 2 ARKANSAS, // … og så videre …};

Enum-nøkkelordet introduserer en sekvens av konstanter kalt en "oppsummering". I dette tilfellet bærer tallet navnet STATE. Hvert element i denne oppstillingen er tilordnet en verdi som starter ved 0 og øker sekvensielt med 1, slik at DC_OR_TERRITORY er definert som 0, ALABAMA er definert som 1, og så videre. Du kan overstyre denne inkrementelle sekvenseringen ved å bruke en tilordnet setning som følger:

enum STATE {DC, TERRITORY = 0, ALABAMA, ALASKA, // … og så videre …};

Denne versjonen av STATE definerer et element DC, som er gitt verdien 0. Den definerer deretter et nytt element TERRITORY, som også tildeles verdien 0. ALABAMA plukker opp med 1, som før.

I praksis kan programmereren bruke tall for å skrive ganske lesbar kode som følgende:

double taxRate (STATS s) {return tax RatesByState [s];}

Det eneste problemet med denne tilnærmingen er at denne oppsummeringen Oppretter ikke en ny type (som du kanskje tror).Faktisk, ifølge standarden er STATE bare et annet navn for int - og konstantene ALABAMA, ALASKA, og så videre, er alle type const int.

Gcc-kompilatoren gir faktisk en enum deklarert på denne måten litt mer autoritet enn bare å kalle det en annen form for int. Du kan faktisk overbelaste funksjoner basert på en enum type:

void fn (STATE s); void fn (int n); fn (Alaska); // påberoper fn (STATE)

2011-standarden lar programmereren lage en helt ny type ved hjelp av enum-søkeordet. Siden skaperne av den nye standarden ikke ville bryte eksisterende kode, krever standarden tillegg av et ekstra søkeord for å definere en opptellingstype, som i følgende eksempel:

enum klasse STATE {DC, TERRITORY = 0, ALABAMA, ALASKA, // … og så videre …};

En opptellingsklasse er nå en fullskala type som enhver annen brukerdefinert klasse. Følgende er ikke engang lovlig lenger av to grunner:

int s = ALASKA;

Først er den konstante ALASKA bare definert innenfor STATE namespace. Dermed er konstantens navn STATE:: ALASKA. For det andre er typen ikke int men STATE. Du kan ikke tildele en verdi av typen STATE til en int.

STATE s = STATE:: ALASKA;

Programmøren kan omstille en STAT til en int, men hun må gjøre det eksplisitt. Forenkler konverteringer ikke kuttet med opptellingsklasser:

int n = (int) STAT:: ALASKA;

Denne nye enumtypen kan også baseres på en av de andre talltypene i tillegg til bare int:

enum klasse STATE: char {DC, // … resten av erklæringen er den samme
Sterkt Typed Enumerations i C ++ - dummies

Redaktørens valg

Hvordan lage Baseball Practice Fun - Dummies

Hvordan lage Baseball Practice Fun - Dummies

Som baseball trener må du ikke bare lære laget ditt grunnleggende i spillet, må du lære disse grunnleggende morsomme, slik at spillerne blir interessert og engasjert. Bruk tipsene i følgende liste for å gjøre baseballøvelsen morsom: Sørg for mange repetisjoner for hvert barn. Stopp treningen kort ...

Basisspillers ansvar i Baseball - dummies

Basisspillers ansvar i Baseball - dummies

Baseball trener er ikke bare ansvarlige for lagspillet som en hel, men for coaching spillere når de når første og tredje base i løpet av et baseballspill. Ansvaret for å coaching hver base er forskjellig. Hva en første basissjåfør gjør: Oppfordrer smeten til å kaste ned første baseline på infield hits. ...

Hvordan fantasy baseball ligaene blir scoret - dummies

Hvordan fantasy baseball ligaene blir scoret - dummies

Fantasy baseball har tre hovedspillformater som bestemmer hvordan ligaen din score punkter. Spillformatene for fantasybaseball er Rotisserie, Head-to-Head One Win og Point System. Hvert format blir scoret avhengig av ligaoppsettet. For eksempel vil 5 × 5 liga score poeng eller gevinster / tap på fem forhåndsvalgte treffstatistikk, samt fem ...

Redaktørens valg

Praktiserer dag til dag, uformell oppmerksomhet - dummies

Praktiserer dag til dag, uformell oppmerksomhet - dummies

Kan trene det når som helst. Uformell oppmerksomhet meditasjon er når du trener oppmerksomhet uten å skille ut en spesiell tid for det. Her er ti eksempler på uformell oppmerksomhet: Mindful kommunikasjon - Når du snakker eller hører på noen andre, blir du klar over lyden av ...

Forbli lekfull og lyshjerte når du praktiserer Mindfulness - dummies

Forbli lekfull og lyshjerte når du praktiserer Mindfulness - dummies

En nydelig holdning til å ha oppmerksomhet og Livet generelt er lekenhet og lethed. Hvis en meditasjon ikke virker for deg første gang eller ikke føles riktig for deg, ikke vær panikk, men tenk på opplevelsen som et eksperiment som du kan prøve igjen senere. Tilnærming oppmerksomhet som du ville et nytt spill eller ...

Redaktørens valg

Valg av resolusjonsstørrelse på et Canon EOS Rebel T3-serie kamera - dummies

Valg av resolusjonsstørrelse på et Canon EOS Rebel T3-serie kamera - dummies

For å bestemme seg for en Kvalitetsinnstilling (eller bildeoppløsningstørrelse) for Canon Rebel T3 eller T3i, den første avgjørelsen du må gjøre er hvor mange piksler du vil at bildet skal inneholde. Piksler er de små firkantede fliser hvorfra alle digitale bilder er laget; piksel er kort for bildeelement. Hvis din ...

Hvordan du lager videobilder på Rebel T7i / 800D - dummies

Hvordan du lager videobilder på Rebel T7i / 800D - dummies

Videoopplastingsfunksjonen på Canon EOS Rebel T7i / 800D fanger korte videoklipp som er sydd i et enkelt opptak, kalt et videoalbum. Du kan stille klippelengden til 8, 4 eller 2 sekunder lang (men alle klippene i et album må ha samme lengde). Med tanke på individets korthet ...