Calma. Ci sono ancora ancora errori sia nel cctor sia nell'operatore di inserimento.
Questo puoi semplificarlo così:
codice:
istream &operator>>(istream &i, list<Fattura> &l)
{
while(i.good()) {
Fattura app;
i >> app;
l.push_back(app);
}
return i;
}
Questo invece ha un errore grave.
codice:
istream &operator>>(istream &in, Fattura &r)
{
...
vector<char*>::iterator t=r.descrizione.begin();
while(t!=r.descrizione.end())
{
char* app; // qui rischi un crash se non allochi memoria per la variabile.
in>>app;
r.descrizione.push_back(app);
} return in;
}
Costruttore copia.
codice:
Fattura::Fattura(const Fattura &f)
{
...
descrizione.resize(f.descrizione.size());
copy(f.descrizione.begin(), f.descrizione.end(), descrizione.begin());
}
Questa parte è errata. Il vector contiene dei pointer quindi servono altri passaggi per non avere problemi quando deciderai di liberare la memoria per i char* di descrizione.
codice:
Fattura::Fattura(const Fattura &f)
{
...
descrizione.resize(f.descrizione.size()); // questo si deve togliere.
vector<char*>::iterator t=f.descrizione.begin();
while(t!=f.descrizione.end()) {
int len = strlen(*it);
char* tmp = new char[len];
copy(*it,( (*it)+len), tmp);
descrizione.push_back(tmp);
}
In ogni caso sia vector sialist sono intelligenti e non serve fare tutta quella trafila per copiarli. Puoi usare semplicemente uno di questi due passaggi:
codice:
Fattura::Fattura(const Fattura &f)
{ nome=new char[strlen(f.nome)+1];
strcpy(nome, f.nome);
cognome=new char[strlen(f.cognome)+1];
strcpy(cognome, f.cognome);
iva=f.iva;
prezzo= f.prezzo;
quantita=f.quantita;
vector<char*>::iterator t=f.descrizione.begin();
while(t!=f.descrizione.end()) {
int len = strlen(*it);
char* tmp = new char[len];
copy(*it,( (*it)+len), tmp);
descrizione.push_back(tmp);
}
}
O meglio ancora:
codice:
Fattura::Fattura(const Fattura &f) : prezzo(f.prezzo), quantita(f.quantità) {
nome=new char[strlen(f.nome)+1];
strcpy(nome, f.nome);
cognome=new char[strlen(f.cognome)+1];
strcpy(cognome, f.cognome);
iva=f.iva;
vector<char*>::iterator t=f.descrizione.begin();
while(t!=f.descrizione.end()) {
int len = strlen(*it);
char* tmp = new char[len];
strcpy(tmp,*it);
descrizione.push_back(tmp);
}
}
Comunque ti sconsiglio di usare char* come fossero stringhe. Usa la std::string piuttosto.