Gjest Slettet-Pqy3rC Skrevet 9. januar 2007 Del Skrevet 9. januar 2007 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
einaros Skrevet 9. januar 2007 Del Skrevet 9. januar 2007 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 Skrevet 9. januar 2007 Del Skrevet 9. januar 2007 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
einaros Skrevet 9. januar 2007 Del Skrevet 9. januar 2007 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 Skrevet 9. januar 2007 Del Skrevet 9. januar 2007 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 ) 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
einaros Skrevet 10. januar 2007 Del Skrevet 10. januar 2007 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 Skrevet 11. januar 2007 Del Skrevet 11. januar 2007 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
Giddion Skrevet 11. januar 2007 Del Skrevet 11. januar 2007 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
einaros Skrevet 11. januar 2007 Del Skrevet 11. januar 2007 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 Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå