Esercizio su iteratori

di il
5 risposte

Esercizio su iteratori

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();
}

5 Risposte

  • Re: Esercizio su iteratori

    Si. l'operator * dell'iteratore restituisce il tipo T con cui instanzi il vector, quindi nel tuo caso restituisce un Player*
  • Re: Esercizio su iteratori

    Se invochi il metodo fight() con (*itr)->fight();
    In egual modo devi invocare getName() con (*itr)->getName();

    Questo perche' *itr e' l'indirizzo di memoria del Player.
    E per accedere al Player al quale punta stai deferenziando itr.
  • Re: Esercizio su iteratori

    Ringrazio entrambi per la risposta, il problema è che avevo messo la funzione getName protected, l'ho resa pubblica e ora riesco ad invocare tale metodo e torna;


    Legolas
    sta combattendo l'elfo
    Gimli
    sta combattendo il nano


    la mia domanda ora è : se invece il metodo getName lo lasciassi protected, quindi non invocabile dal main, c'è un altro modo per accedere ai nomi e stamparli?
  • Re: Esercizio su iteratori

    No. A meno di non usare una funzione friend, ma in questo caso è una complicazione inutile.
  • Re: Esercizio su iteratori

    Perfetto grazie mille a entrambi, molto gentili
Devi accedere o registrarti per scrivere nel forum
5 risposte