Ok scusa ma non volevo esser scortes...nn è da me... ti posto tutto il codice che ho fatto e te ne sarei grat se mi risolv il problema.grazie
/*La classe Libro contiene le seguenti variabili
membro:
- Autore: (stringa allocata dinamicamente)
- Titolo : (stringa allocata dinamicamente)
- numpp: numero di pagine (intero)
Le classi devono prevedere gli opportuni costruttori, e devono gestire
correttamente l'estensione dinamica fornendo le opportune funzionalità.
Devono inoltre fornire l'overloading degli operatori di flusso << e >>
*/
#ifndef LIBRO_H_
#define LIBRO_H_
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
class Libro{
friend ostream& operator<<(ostream&,const Libro&);
friend istream& operator>>(istream&, Libro&);
protected:
char* Autore;
char* Titolo;
int numpp;
public:
Libro(): Autore(""), Titolo(""), numpp(0){} //costruttore senza argomenti
Libro(const char*A="", const char* T="", const int N=0); //costruttore con argomenti
virtual ~Libro(){delete[]Autore; delete[]Titolo;} //distruttore
Libro(const Libro&); //costruttore di copia
//funzioni get e set
char* getAutore()const{return Autore;}
char* getTitolo()const{return Titolo;}
int getNumpp()const{return numpp;}
void setAutore(const char*);
void setTitolo(const char*);
void setNumpp(const int N){numpp=N;}
const Libro&operator=(const Libro&);
};
#endif
//implementazione classe libro
#include "libro.h"
//costruttore con argomenti
Libro::Libro(const char*A, const char*T, const int N){
Autore=new char[strlen(A)+1];
strcpy(Autore, A);
Titolo=new char[strlen(T)+1];
strcpy(Titolo,T);
numpp=N;
}
//costruttore di copia
Libro::Libro(const Libro&L){
Autore=new char[strlen(L.Autore)+1];
strcpy(Autore, L.Autore);
Titolo=new char [strlen(L.Titolo)+1];
numpp=L.numpp;
}
//set autore
void Libro::setAutore(const char* A){
delete[]Autore;
Autore=new char[strlen(A)+1];
strcpy(Autore, A);
}
//set titolo
void Libro::setTitolo(const char*T){
delete[]Titolo;
Titolo=new char[strlen(T)+1];
strcpy(Titolo,T);
}
//operatore =
const Libro&Libro::operator=(const Libro&L){
if(this!=&L){
if (Autore)delete[]Autore;
Autore=new char[strlen(L.Autore)+1];
strcpy(Autore, L.Autore);
if(Titolo)delete[]Titolo;
Titolo=new char[strlen(L.Titolo)+1];
strcpy(Titolo, L.Titolo);
numpp=L.numpp;
}
return *this;
}
//operator <<
ostream&operator<<(ostream&out, const Libro&L){
out<<"\n autore del libro:"<<L.Autore<<endl;
out<<"\n Titolo del libro:"<<L.Titolo<<endl;
out<<"\n numero pagine del libro:"<<L.numpp<<endl;
return out;
}
//operatore >>
istream&operator>>(istream&in, Libro&L){
char buff1[20];
in.ignore();
cout<<"\n autore del libro:"<<endl;
in.getline(buff1,20);
L.setAutore(buff1);
char buff2[20];
cout<<"\n titolo del libro:"<<endl;
in.getline(buff2,20);
L.setTitolo(buff2);
cout<<"\n numero di pagine:"<<endl;
int n;
in>>n;
L.setNumpp(n);
return in;
}
//eccezione No_Item
#ifndef NO_ITEM_H_
#define NO_ITEM_H_
#include <iostream>
#include <string.h>
using namespace std;
class NO_Item{
private:
string msg;
public:
NO_Item():msg("Errore! stai tentato di estrarre una pila vuota"){}
const string what()const{return msg;}
};
#endif
/*La pila è realizzata mediante una classe template ed è rappresentata mediante
lista a puntatori.
La funzione membro pop lancia una eccezione nel caso si tenti di estrarre da
una pila vuota.
L'eccezione, di tipo NO_Item, è definita dallo studente.
La sessione di scrittura su file viene gestita dalla classe pila, che definisce
la variabile di tipo stream.
*/
#ifndef PILA_H_
#define PILA_H_
#include <iostream>
#include <fstream>
#include "NO_item.h"
using namespace std;
template <class T> class Pila;
//template nodo
template<class T> class Nodo{
friend class Pila<T>;
private:
T elem;
Nodo<T>* succ;
public:
Nodo(): elem(0),succ(0){}
};
//template pila
template <class T> class Pila{
typedef Nodo<T> *P; //puntatore al nodo
private:
P testa;
public:
Pila(){testa=0;} //costruttore
~Pila(){clear();} //distruttore
void push(const T&);
void pop(T&) throw (NO_Item);
void top(T&)const;
bool empty(){return testa==0;}
bool full()const{return false;}
void clear();
void stampa()const;
void memorizzasufile();
//bool memorizzasufile(const char * filepath);
};
#endif
//implementazione
//push
template <class T>
void Pila<T>::push(const T&e){
P q=new Nodo<T>;
q->elem=e;
q->succ=testa;
testa=q;
}
//pop
template <class T>
void Pila<T>::pop(T&e)throw (NO_Item){
if(empty()) throw (NO_Item());
else{
e=testa->elem;
P q=testa;
testa=testa->succ;
delete q;
}
}
//top
template<class T>
void Pila<T>::top(T&e)const{
e=testa->elem;
}
//clear
template <class T>
void Pila<T>::clear(){
P temp;
while(temp){
temp=testa;
testa=testa->succ;
delete temp;
}
}
//stampa pila
template <class T>
void Pila<T>::stampa()const{
P temp=testa;
while(temp){
cout<<temp->elem<<' '<<endl;
temp=temp->succ;
}
}
/*
//stampa su file
template <class T>
bool Pila<T>:: memorizzasufile(const char * filepath){
ofstream outfile; //dichiaro una variabile ofstream
outfile.open(filepath); //apro il file
if(!outfile) return false;
else{
P temp=testa;
while(temp){
outfile<<temp->elem<<endl;
temp=temp->succ;
}
outfile.close(); //chiudo il file
return true;
}
}
*/
//stampa su file
template <class T>
void Pila<T>:: memorizzasufile(){
ofstream outfile; //dichiaro una variabile ofstream
outfile.open("documenti.txt", ios::out); //apro il file
if(!outfile) cout<<"\n Errore"<<endl;
else{
P temp=testa;
while(temp){
outfile<<temp->elem<<endl;
temp=temp->succ;
}
outfile.close(); //chiudo il file
}
}
//classe testo che deriva da libro
/*La classe Testo aggiunge le variabili membro:
- Corso: corso universitario in cui è adottato (stringa allocata dinamicamente)
- Serie: ad esempio Computer Science, Medicina, etc. : (stringa allocata dinamicamente)
*/
#ifndef TESTO_H_
#define TESTO_H_
#include "libro.h"
#include <fstream>
class Testo:public Libro{
private:
char* Corso;
char* Serie;
public:
Testo(const char*A="", const char*T="", const int N=0, const char*C="", const char*S=""); //costruttore con argomenti
~Testo(){delete[]Corso; delete[]Serie;}
Testo(const Testo&);
//get e set
char* getCorso()const{return Corso;}
char* getSerie()const{return Serie;}
void setCorso(const char*);
void setSerie(const char*);
//operatori =,<< e >>
const Testo&operator=(const Testo&);
friend ostream& operator<<(ostream&, const Testo&);
friend istream& operator>>(istream&, Testo&);
//scrittura su file
// friend ofstream&operator<<(ofstream&, const Testo&);
};
#endif
//implementazione classe testo
#include "testo.h"
//costruttore con argomenti
Testo::Testo(const char*A, const char*T, const int N, const char*C, const char*S):
Libro(A,T,N){
Corso=new char[strlen(C)+1];
strcpy(Corso, C);
Serie=new char[strlen(S)+1];
strcpy(Serie, S);
}
//costruttore di copia
Testo::Testo(const Testo&T): Libro(T){
delete[]Corso;
Corso=new char[strlen(T.Corso)+1];
}
//set corso
void Testo::setCorso(const char*C){
Corso=new char[strlen(C)+1];
strcpy(Corso,C);
}
//set Serie
void Testo::setSerie(const char*S){
Serie=new char[strlen(S)+1];
strcpy(Serie, S);
}
//operatore =
const Testo & Testo::operator=(const Testo&T){
if(this!=&T){
Libro::operator=(T);
if(Corso)delete[]Corso;
Corso=new char[strlen(T.Corso)+1];
strcpy(Corso, T.Corso);
if(Serie)delete[]Serie;
Serie=new char[strlen(T.Serie)+1];
strcpy(Serie, T.Serie);
}
return *this;
}
//operatore <<
ostream& operator<<(ostream&out, const Testo &T){
out<<*(Libro*)(&T);
out<<"\n corso:"<<T.Corso<<endl;
out<<"\n Serie:"<<T.Serie<<endl;
return out;
}
//operatore >>
istream& operator>>(istream&in, Testo&T){
in >> * (Libro*)(&T);
char buff1[20];
in.ignore();
cout<<"\n corso:"<<endl;
in.getline(buff1,20);
T.setCorso(buff1);
char buff2[20];
cout<<"\n serie:"<<endl;
in.getline(buff2,20);
T.setSerie(buff2);
return in;
}
#include <iostream>
#include "pila.h"
#include "libro.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
/*
Pila <int>A;
int a=5;
A.push(a);
A.stampa();*/
//prova template pila
Pila <int>A;
int a=5, b=6, c=7;
A.push(a);
A.push(b);
A.push(c);
A.stampa();
A.memorizzasufile("a.txt");
try{
A.pop(a);
}
catch(string){
cout<<"\n Errore! stai tentato di estrarre una pila vuota"<<endl;
}
}
Grazie....