Gå til innhold

Legge til verdier i en enum ?


Gjest Slettet-Pqy3rC

Anbefalte innlegg

Gjest Slettet-Pqy3rC

Hei alle;

 

Lurte på om noen hadde et tips om hvordan en kan 'utvide' en enum (eller andre varianter).

 

F.eks i en .hpp;

 

enum MyType {mtFirst,mtSecond};

 

og så få (i en annen .hpp) lagt til en verdi (f.eks mtThird) til "MyType" enum'en, slik at dersom denne nye .hpp er #include'ed har 'MyType 3 ulike verdier ?

 

Vet at en kan benytte #define men da mister en typedefinsjonen (MyType)...

 

Noen som har noe forslag til andre løsninger?

Lenke til kommentar
Videoannonse
Annonse
Hei alle;

 

Lurte på om noen hadde et tips om hvordan en kan 'utvide' en enum (eller andre varianter).

 

F.eks i en .hpp;

 

enum MyType {mtFirst,mtSecond};

 

og så få (i en annen .hpp) lagt til en verdi (f.eks mtThird) til "MyType" enum'en, slik at dersom denne nye .hpp er #include'ed har 'MyType 3 ulike verdier ?

7684787[/snapback]

 

Før du velger en slik løsning, bør du nok revurdere om det er den riktige retningen å gå i. Er det du som har definert enumen i headerfilen? Hvordan ser du i såfall for deg at det blir noen forskjell mellom å definere i header og utvide i .cpp / annen header?

Lenke til kommentar
Gjest Slettet-Pqy3rC
Er det du som har definert enumen i headerfilen?

 

Yep.

 

Hvordan ser du i såfall for deg at det blir noen forskjell mellom å definere i header og utvide i .cpp / annen header?

 

Okey. Litt forklaring. Har en base class som dette;

 

 

enum MyClassType {mcUnknown,mcBase};

class MyBase {
private:
   MyClassType classType;
protected:
   __fastcall MyBase() {SetClassType(mcBase);}
   __fastcall ~MyBase() {}
   void __fastcall SetClassType(MyClassType ct) {classType = ct;}
public:
   MyClassType __fastcall GetClassType() {return classType;}
};

 

Enumeratoren MyClassType har pd. 500+ elementer som angir alle klasser i systemet. Alle klassene er arvet fra MyBase og er i hver sin header fil (noen nært tilknyttet i samme).

Hver gang en ny klasse legges til eller fjernes må "MyBase.hpp" oppdateres.

 

Et annet "problem" er at noen klasser utelates med #ifdef under ulike kompileringer. Det er lett å glemme (og innimellom vanskelig på få til) og fjerne disse klassene fra MyClassType enumeratoren med samme #ifdef.

 

Er det noen måte å "automatisere" dette på?

 

sånn at en kan endre i de ulike header filene og ikke behøve oppdatering av enumeratoren.

 

Eller noen annen (bedre) måte å få til det samme ?

Lenke til kommentar
Hver gang en ny klasse legges til eller fjernes må "MyBase.hpp" oppdateres.

Kan du ikke da legge den til i enum-definisjonen? Må det gjøres ellers i koden? Poenget mitt er at klassene havner ikke der runtime, eller compiletime (med mindre du bruker templates, og vurderer hver instans som en egen klasse); så jeg ser ikke helt grunnen til ikke å legge det rett inn i definisjonen.

 

Er det noen måte å "automatisere" dette på?

7686327[/snapback]

 

Du har egentlig bare to muligheter.

1. Preprosesser koden din med et selvskrevet script/program, og generer enum-definisjonen.

2. Dersom du bruker C++/CLI (noe jeg finner svært lite sannsynlig, og uansett neppe ville anbefale), kan du bruke refleksjon til å hente ut klasser run- eller compiletime og generere enumen.

Lenke til kommentar
Gjest Slettet-Pqy3rC
Kan du ikke da legge den til i enum-definisjonen?

 

Joda, og det er akkurat hva vi gjør.

Jeg lurte bare på om det fantes en annen måte. Bla. annet fordi #ifdef / #ifndef logikken i enum definisjonen (fjerner de typer som ikke er i bruk under kompileringen) begynner å bli ganske kompleks...(enum definisjonen er på ca. 4000 linjer :cry: )

 

1. Preprosesser koden din med et selvskrevet script/program, og generer enum-definisjonen.

2. Dersom du bruker C++/CLI (noe jeg finner svært lite sannsynlig, og uansett neppe ville anbefale), kan du bruke refleksjon til å hente ut klasser run- eller compiletime og generere enumen.

 

Ingen av disse forslagene er særlig aktuelle, men takk for innspillet.

Lenke til kommentar
1. Preprosesser koden din med et selvskrevet script/program, og generer enum-definisjonen.

2. Dersom du bruker C++/CLI (noe jeg finner svært lite sannsynlig, og uansett neppe ville anbefale), kan du bruke refleksjon til å hente ut klasser run- eller compiletime og generere enumen.

Ingen av disse forslagene er særlig aktuelle, men takk for innspillet.

7686673[/snapback]

Du vil autogenerere enumen, men ikke skrive noe kode for å gjøre det? Det gir lite mening for meg. Det finnes i hvertfall absolutt ingen måte for deg å fylle inn enumen automatisk, med hjelp av verken macroer eller preprocessor / compile-time-mekanismer. Å skrive et script som genererer enumen, derimot, ville være temmelig simpelt.

Lenke til kommentar
Gjest Slettet-Pqy3rC
Du vil autogenerere enumen, men ikke skrive noe kode for å gjøre det? Det gir lite mening for meg. Det finnes i hvertfall absolutt ingen måte for deg å fylle inn enumen automatisk, med hjelp av verken macroer eller preprocessor / compile-time-mekanismer. Å skrive et script som genererer enumen, derimot, ville være temmelig simpelt.

7687555[/snapback]

Jeg var bare ute etter om en kunne gjøre dette på en eller annen 'enklere' måte, ellers kan jeg forstette def. av med enum'en på ett sted som før. Håpet var noe sånt som å kunne kunne 'spre' enum'en til de ulike .cpp/.hpp.

Det er ikke noe must å automatisere dette, bare lurte ...

Lenke til kommentar
Håpet var noe sånt som å kunne kunne 'spre' enum'en til de ulike .cpp/.hpp.

Det er ikke noe must å automatisere dette, bare lurte ...

7695873[/snapback]

 

Du kan jo alltids gjøre noe slikt som dette.

 

[/code]

#define ENUM_H1 a,b,c,d,e,f

#define ENUM_H2 g,h,i,j

 

enum test

{

ENUM_H1,

ENUM_H2,

};




			
		
Lenke til kommentar
Håpet var noe sånt som å kunne kunne 'spre' enum'en til de ulike .cpp/.hpp.

Det er ikke noe must å automatisere dette, bare lurte ...

7695873[/snapback]

 

Du kan jo alltids gjøre noe slikt som dette.

 

[/code]

#define ENUM_H1 a,b,c,d,e,f

#define ENUM_H2 g,h,i,j

 

enum test

{

ENUM_H1,

ENUM_H2,

};

[right][snapback]7698646[/snapback][/right]

 

Tror nok jeg hadde holdt meg til å skrive det rett i enumen :roll:

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...