Salve a tutti ho un problema che non riesco a risolvere in questo programa che vi descrivo in poche parole: Il programma vuole gestire una gerarchia di animali; la classe padre (che è anche virtuale in quanto possiede una funzione del tipo "virtual stampa_dati()=0") si chiama animale e in essa sono definite il codice dell'animale e la specie.Poi ci sono 2 classi figlie che sono mammifero e rettile in cui sono definite alcune funzioni "speciali" e dove vi sono ridefinite la funzione virtuale della classe padre. Poi si vuole realizzare un oggetto pila statica in cui vengono pushati i mammiferi che pesano meno di 100 kg e i rettili che sono definiti di tipo "A".Nella realizzazione della gerarchia di animali non ho trovato difficoltà, ma le ho trovate quando devo implementare la classe pila statica; in particolare il compilatore mi da i seguenti errori che proprio non riesco a risolvere; vi posto qui lo spezzone di codice in cui ci sono gli errori e dopo il resto del programma:
codice:
In member function `void pila::inserisci_nodo(rettile, mammifero)':
no match for 'operator=' in 'p[((pila*)this)->pila::t] = e'
no match for 'operator=' in 'p[((pila*)this)->pila::t] = f'
In member function `void pila::stampa_pila() const':
no match for 'operator<<' in 'std::cout << p[i]'
#ifndef PILAS_H_
#define PILAS_H_
#include "rettile.h"
#include "mammifero.h"
#include <iostream>
using namespace std;
class pila{
private:
int t;
static const int dim=5;
public:
pila(){t=0;}
pila(const pila &);
const pila & operator=(const pila &){};
void inserisci_nodo(const rettile e,const mammifero f);
void stampa_pila()const;
};
#endif
#include "pila.h"
#include <iostream>
using namespace std;
void pila::inserisci_nodo(const rettile e,const mammifero f)
{
pila p[dim];
if(e.get_tipo()=="A")
{
p[t]=e;
t++;
} else if(f.get_peso()<100)
{ p[t]=f;
t++;}
}
void pila::stampa_pila() const
{
pila p[dim];
cout<<"Gli animali presenti nella pila sono:\n";
for(int i=0;i<dim;i++)
cout<<p[i]<<endl;
}
Ecco il resto del programma dove è illustrata la realizzazione della gerarchia:
codice:
#ifndef ANIMALE_H_
#define ANIMALE_H_
#include <iostream>
#include <string>
using namespace std;
class animale{
protected:
string codice;
string specie;
public:
animale(const string c="",const string s="")
{codice=c;specie=s;}
animale(const animale &);
const animale & operator=(const animale & A);
virtual void stampa_dati()=0;
};
#endif
#include "animale.h"
animale::animale(const animale & A)
{
this->codice=A.codice;
this->specie=A.specie;
}
const animale & animale::operator=(const animale & A)
{
if(this!=&A)
{
this->codice=A.codice;
this->specie=A.specie;
}
return *this;
}
#ifndef MAMMIFERO_H_
#define MAMMIFERO_H_
#include "animale.h"
#include <string>
class mammifero:public animale{
private:
float peso;
public:
mammifero(const string c="",const string s="",const float p=0.0):animale(c,s)
{peso=p;}
mammifero(const mammifero &);
const mammifero & operator=(const mammifero &);
virtual void stampa_dati();
float get_peso() const {return peso;}
};
#endif
#include "mammifero.h"
mammifero::mammifero(const mammifero & M):animale(M)
{this->peso=M.peso;}
const mammifero & mammifero::operator=(const mammifero & M)
{
if(this!=&M)
{
animale::operator=(M);
this->peso=M.peso;
}
return *this;
}
void mammifero::stampa_dati()
{
cout<<"Dati relativi ad un mammifero:\n";
cout<<"Codice: "<<codice<<"\n";
cout<<"Specie: "<<specie<<"\n";
cout<<"Peso: "<<peso<<"\n";
}
#ifndef RETTILE_H_
#define RETTILE_H_
#include <iostream>
#include <string>
#include "animale.h"
using namespace std;
class rettile:public animale{
private:
string tipoesemplare;
public:
rettile(const string c="",const string s="",const string t=""):animale(c,s)
{tipoesemplare=t;}
rettile(const rettile &);
const rettile & operator=(const rettile &);
virtual void stampa_dati();
const string get_tipo() const {return tipoesemplare;}
};
#endif
#include "rettile.h"
rettile::rettile(const rettile & R):animale(R)
{this->tipoesemplare=R.tipoesemplare;}
const rettile & rettile::operator=(const rettile & R)
{
if(this!=&R)
{
animale::operator=(R);
this->tipoesemplare=R.tipoesemplare;
}
return *this;
}
void rettile::stampa_dati()
{
cout<<"Codice: "<<codice<<"\n";
cout<<"Specie: "<<specie<<"\n";
cout<<"Tipo di esemplare: "<<tipoesemplare<<"\n";
}