Salve a tutti, ho una classe astratta Player la quale ha due classi derivate Elf e Dwarf, queste ultime sono analoghe, servono solo per fare pratica con il polimorfismo.
Premesso che sia riuscito a fare bene il tutto, devo stampare il nome del personaggio "Gimli" e "Legolas" con l'uso di un iteratore costante nel main
Inoltre devo invocare il metodo void fight() giusto tra quello specializzato in Elf e in Dwarf.
Il mio problema è che mi stampa :
0x7f9d29402a10
sta combattendo l'elfo
0x7f9d29402a30
sta combattendo il nano
il problema è il nome, che invece che essere una stringa è un indirizzo, ho provato a ragionarci un bel po' ma non ne vengo a capo, forse per un mio fraintendimento teorico?
grazie a chi mi aiuterà
MAIN
//Le sottoclassi devono poi essere utilizzabili nel seguente programma,
// che deve essere completato nelle righe indicata da FIXME:
#include <iostream>
#include <vector>
#include "Player.h"
#include"Elf.h"
#include "Dwarf.h"
using namespace std;
int main() {
vector<Player *> playerGroup;
Elf *aElf = new Elf("Legolas");
Dwarf *aDwarf = new Dwarf("Gimli");
playerGroup.push_back(aElf);
playerGroup.push_back(aDwarf);
vector<Player *>::const_iterator itr;//mi permette di leggere senza modificare i dati
for (itr = playerGroup.begin(); itr != playerGroup.end(); itr++) {
cout << *itr <<endl; // FIXME: stampare il nome del personaggio
(*itr)->fight(); // FIXME: come invoco questo fight ?
}
return 0;
}
PLAYER.H
#include <iostream>
using namespace std;
#include "Player.h"
class Player {
public:
Player(string name); // FIXME: scrivere costruttore
virtual ~Player(){};
// metodo virtuale rende la classe astratta
virtual void fight() = 0;
//metto protected
protected:
string _name; // FIXME: scrivere metodo getter del nome
string getName();
};
PLAYER .CPP
#include "Player.h"
//scrivo costruttore
Player::Player(string name) {
_name = name;
}
//implemento metodo get
string Player::getName() {
return _name;
le due classi derivate sono analoghe, quindi ne metto solo una
DWARF .H
#include "Player.h"
class Dwarf: public Player {
public:
explicit Dwarf(string name);
~Dwarf(){};
virtual void fight()override;
};
DWARF.CPP
#include "Dwarf.h"
void Dwarf::fight() {
cout << "sta combattendo il nano" <<endl;
}
Dwarf::Dwarf(string name) : Player(name) {
name = getName();
}