-kga- Skrevet 10. mars 2009 Del Skrevet 10. mars 2009 Jeg har ikke c++ program forann meg her nå, så jeg får ikke testet meg frem. Vi har en klasse Person, og denne klassen har foreksempel en peker av type våpen som holder våpen klassen. Si våpen peker til en sverd klasse. Person p1; p1.setVåpen(new Sverd); Person p2; p2.copy(p1); Her vill jeg att P2 sin våpen peker skal peke på ett nytt sverd objekt og ikke det samme som p1 peker på. Så jeg kann ikke bare sette våpen pekeren i p2 til å peke på den samme som den hos p1 peker på. Jeg kan heller ikke skrive ett sett med if setninger inne i copy funksjonen som sier som sier: if(p1.getVåpen() == Sverd) våpen = new Sverd(); Da blir koden lite modular siden jeg da må endre copy funksjonen for hver klasse jeg legger til. Og meninga er att det skal lett gå ann å legge til nye klasser som arver fra Våpen klassen og dermed kan bli lagret i denne pekeren. Lenke til kommentar
zotbar1234 Skrevet 10. mars 2009 Del Skrevet 10. mars 2009 Da blir koden lite modular siden jeg da må endre copy funksjonen for hver klasse jeg legger til. Og meninga er att det skal lett gå ann å legge til nye klasser som arver fra Våpen klassen og dermed kan bli lagret i denne pekeren. En mulig løsning er å lage en copy-funksjon i våpen-klassen, slik at person sin copy() kan bruke den. class Weapon { public: virtual ~Weapon(); virtual Weapon* clone(); }; class Sword: public Weapon { int damage, weight; public: Sword(const Sword& other): damage(other.damage), weight(other.weight){}; Sword* clone(){ Sword *copy = new Sword(*this); return copy; } }; ... og har du struct Person { Weapon *w; // ... }; så vil Person p; p.w->copy(); gi en ny kopi av p sitt våpen. Et nyttig uttrykk i dette tilfellet er "covariant return types". Lenke til kommentar
-kga- Skrevet 10. mars 2009 Forfatter Del Skrevet 10. mars 2009 Takker. Kjekk sak som nokk kommer til å komme til nytte mange ganger. 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å