Ereditarietà e polimorfismo c++

di il
5 risposte

Ereditarietà e polimorfismo c++

Ciao ragazzi,ho il seguente problema. Ho la classe Treno, da cui ereditano le classi Espresso Intercity e Freccia Rossa.La classe Treno ha 2 metodi virtuali, getNumeroPosti e getPrezzo che vengono implementati nelle classi figlie. Poi la classe Prenotazione, dove oltre ad esserci le varie info riguardanti partenza arrivo distanza ecc, c e nel campo private, e quindi nel costruttore, il Treno..
Infine c e il GestorePrenotazioni, che contiene una lista di Prenotazioni,e varie funzioni di utilita, come aggiungere e rimuovere una prenotazione. Ma ora veniamo al problema, funziona tutto,anche se gli faccio leggere una file,me lo stampa in un altro file l output, ma se provo a creare "manualmente" io nel main un treno e metterlo nella Prenotazione non riesco,mi potete aiutare?
Io faccio cosi:
Treno* t1;
Prenotazione p1(t1,partenza,arrivo....);
cout << p1;
Ma niente non va,o meglio mi da in stampa gli indirizzi di memoria dei campi protetti del treno.
Se invece dopo la dichiarazione, provo a fare un t1->setNumeroPosti(X), non mi stampa niente.Come posso risolvere? Grazie in anticipo.

5 Risposte

  • Re: Ereditarietà e polimorfismo c++

    Sarebbe meglio che postassi il codice senza costringerci a indovinare.
    Comunque:
    
    Treno* t1;
    
    NON crea un treno: dichiara solo un puntatore.
  • Re: Ereditarietà e polimorfismo c++

    TRENO
    #ifndef TRENO_H_
    #define TRENO_H_
    #include<iostream>
    using namespace std;
    #include<fstream>
    
    class Treno
    {
    	friend ostream& operator<<(ostream& out, const Treno& t);
    public:
    
    	Treno();
    	Treno(int numeroTreno);
    	void setNumeroTreno(int);
    	void setNumeroPosto(int);
    	void setPrezzo(double);
    	int getNumeroTreno()const;
    	virtual int getNumeroPosto() = 0;
    	virtual double getPrezzo() = 0;
    
    
    protected:
    	int numeroTreno;
    	int numeroPosto;
    	double prezzo;
    };
    
    #endif
    
    PRENOTAZIONE
    #ifndef PRENOTAZIONE_H_
    #define PRENOTAZIONE_H_
    #include<iostream>
    using namespace std;
    #include"Espresso.h"
    #include"Frecciarossa.h"
    #include"Intercity.h"
    #include<string>
    
    class Prenotazione
    {
    	friend ostream& operator <<(ostream& out, const Prenotazione& p);
    public:
    	Prenotazione(Treno*, string partenza, string arrivo, int distanza, int classe, string nomePasseggero);
    
    	void setTreno(Treno* t);
    	void setPartenza(string partenza);
    	void setArrivo(string arrivo);
    	void setDistanza(int distanza);
    	void setClasse(int classe);
    	void setNomePasseggero(string nomePasseggero);
    
    	Treno* getTreno();
    	string getPartenza();
    	string getArrivo();
    	int getDistanza();
    	int getClasse();
    	string getNomePasseggero();
    
    	double getCostoTotale();
    	bool operator==(const Prenotazione& p)const;
    
    private:
    	Treno* treno;
    	string partenza;
    	string arrivo;
    	int distanza;
    	int classe;
    	string nomePasseggero;
    };
    
    #endif
    
    INTERCITY
    #ifndef INTERCITY_H_
    #define INTERCITY_H_
    #include<iostream>
    using namespace std;
    #include"Treno.h"
    #include<fstream>
    
    class Intercity : public Treno
    {
    public:
    	Intercity(int numeroTreno);
    	virtual int getNumeroPosto();
    	virtual double getPrezzo();
    };
    
    #endif
    
    MAIN
    #include<iostream>
    #include"Prenotazione.h"
    #include"Treno.h"
    #include"GestorePrenotazione.h"
    #include"Intercity.h"
    #include"Frecciarossa.h"
    #include"Espresso.h"
    using namespace std;
    
    int main()
    {
    	GestorePrenotazione gs;
    	Treno* t1;
    	//t1->setNumeroTreno(222);
    
    	Prenotazione p1(t1,"torino","roma",500,2,"Giovanni");
    	//gs.aggiungiPrenotazione(p1);
    	cout <<  p1;
    
    //	GestorePrenotazione gp;
    //	gp.leggiPrenotazione("input.txt");
    //	gp.stampaPrenotazione("output.txt");
    //	cout<<gp<<endl;
    
    	return 0;
    }
    
    Se serve anche il cpp ditemelo..ho messo solo intercity perche tanto espresso e frecciarossa sono uguali..
  • Re: Ereditarietà e polimorfismo c++

    Come già detto
    
    Treno* t1;
    
    non crea un treno: dichiara solo un puntatore.
    Se vuoi creare un treno devi fare:
    
    Treno* t1 = new Treno(/* eventuali parametri se previsti */);
    
    Tuttavia ha poco senso dato che devi creare istanze delle sottoclassi per avere il polimorfismo.
    Es.
    
    Intercity* ic = new intercity(/* eventuali parametri se previsti */);
    Prenotazione p1(ic,"torino","roma",500,2,"Giovanni");
    
    Inoltre trattando puntatori grezzi devi prevedere anche un costruttore di copia per la classe Prenotazione e un distruttore che liberi i vari treni quando la prenotazione viene rimossa.
    In caso contrario avrai dei memory leaks.
  • Re: Ereditarietà e polimorfismo c++

    Se faccio
    Treno* t1 = new Treno(2);
    mi da questo errore
    Multiple markers at this line
    	- The type 'Treno' must implement the inherited pure virtual method 
    	 'Treno::getNumeroPosto'
    	- The type 'Treno' must implement the inherited pure virtual method 
    	 'Treno::getPrezzo'
    	- cannot allocate an object of abstract type ‘Treno’
    E anche se non do parametri.
  • Re: Ereditarietà e polimorfismo c++

    La classe Treno è astratta (perché i due metodi segnalati sono = 0) e non puoi creare istanze astratte di una classe. Devi creare un'istanza di una classe derivata da Treno.
    (A ogni modo non avrebbe senso creare istanze di Treno, nemmeno se non fosse astratta, perché non si attiva il polimorfismo).
    Inoltre nella classe Treno serve inserire il distruttore virtuale.
    
        virtual ~Treno() {}
    
    per evitare problemi con l'ereditarietà polimorfica.
Devi accedere o registrarti per scrivere nel forum
5 risposte