Mappe en klasse

Tags:    c++

<< < 123 > >>
Hey allesammen!
Er det muligt at mappe en klasse der fx arver fra en anden?
Altså noget i stil med:
Fold kodeboks ind/udKode 

Og så få et map til at mappe Sister og Children?



Har lavet om på det hele, og har nu functionerne jeg vil have i mappet i samme klasse som selve mappet. Alle funktionerne er void.
Hvordan laver jeg mit map så de passer på dem allesammen?
std::map<std::string, void (*)()>
passer ikke på
void Class::menu(std::vector<std::string> test);

Hvad skal jeg gøre?

Det er fordi din metode tager en parameter. Måske endda to. Member funktioner på en klasse tager nemlig en skjult parameter, som er referencen til objektet selv.

Er du sikker på at du vil mappe funktions pointere ? Det er ikke C++ måden at gøre det på. Polymorfi er vejen frem.



Polymorfi har da absolut intet med sagen at gøre?! Jeg har brug for at kører en funktion afhængigt af input fra brugeren. Derfor spørger jeg om jeg bliver nød til at bruge if else, og i svarer "Nej, brug et map". Og nu siger du at det er forkert?! Hvad skal jeg gøre.. :S



Problemet er at du ikke kan bruge en generisk pointer til en funktion til at pege på en funktion i en class.

Der er en lille gennemgang af emnet her:
http://www.parashift.com/c++-faq-lite/pointers-to-members.html

Jo, sagen har alt med polimorfi at gøre.



Polymorfi har da absolut intet med sagen at gøre?! Jeg har brug for at kører en funktion afhængigt af input fra brugeren. Derfor spørger jeg om jeg bliver nød til at bruge if else, og i svarer "Nej, brug et map". Og nu siger du at det er forkert?! Hvad skal jeg gøre.. :S


Polimorfi har ALT med sagen at gøre. Mit eksempel fra før kalder en polimorf metode i nedarvet klasse på baggrund af input fra brugeren.
Jeg brugte et map til at mappe tekst (som brugeren indtaster) til et objekt af en klasse som nedarver Command klassen. Den nedarvede klasse skal implementere execute() metoden (dette er polymorfi).
Man kan så tilføje flere Command arvinger og tilføje dem. Og så slipper man for en masse grimme if/else konstruktioner.

Man kunne endda mappe den samme klasse til flere tekster:

commands["exit"] = new Exit;
commands["quit"] = commands["exit"];
commands["leave"] = commands["exit"];



Endnu en fordel ved at bruge fremgangsmåden med et map i stedet for en lang omgang if/else er, at når du begynder at lave større programmer, så kan du dele programmet op i plugins.
Hvert plugin kan så registrere alle de Command objekter, som de vil. Det kan man ikke med if/else (i hvert fald ikke ligeså elegant). Der er man nødt til at ændre i den oprindelige konstruktion.

Prøv at læse mit eksempelkode igennem. Det gør vel stort set, hvad du beder om.

Man kunne så udvidde lidt så execute() metoderne skal tage en vector<string> som parameter, som så indeholder argumenterne, men det er jo så op til dig, om du vil det.

Præcis dét har jeg selv gjort i et Java program, jeg sidder med.



Er stødt ind i et problem:
Jeg har to filer:
En med en command:
cmd.h
Som jeg gerne vil have til at arve fra
allcmd.h

Og jeg vil gerne kunne bruge klassen i cmd.h i filen allcmd.h

Hvad skal jeg gøre? Det er jo helt normal praksis at dele sine klasser op i .h og .cpp hver for sig, men ved ikke hvad jeg skal gøre...



Har fået det til at virke nu, men det er lidt irriterende at jeg ikke kan have virtual klasser i min .cpp fil. Skal jeg så bare erklære mine kommandoer i .h filer?



Er stødt ind i et problem:
Jeg har to filer:
En med en command:
cmd.h
Som jeg gerne vil have til at arve fra
allcmd.h

Og jeg vil gerne kunne bruge klassen i cmd.h i filen allcmd.h

Hvad skal jeg gøre? Det er jo helt normal praksis at dele sine klasser op i .h og .cpp hver for sig, men ved ikke hvad jeg skal gøre...


Show me the code.
Det lyder lidt som om du vil have implementering i din allcmd.h fil, og det er nok både grimt og forkert.

Put din Command klasse i en header fil, som ikke inkluderer noget andet.



Sorry, fik klaret det selv.. De klasser der arvede behøves ikke at have virtual keywordet... :)
Tak for hjælpen begge to!



Sorry, fik klaret det selv.. De klasser der arvede behøves ikke at have virtual keywordet... :)
Tak for hjælpen begge to!


Hvad mener du ?

Hvis en metode kan overstyres så skal den erklæres virtual: http://www.codersource.net/cpp_virtual_functions.html



<< < 123 > >>
t