Gå til innhold

Nytt objekt av samme type som det en peker peker på


Anbefalte innlegg

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
Videoannonse
Annonse
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

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å
×
×
  • Opprett ny...