Ho modificato leggermente il codice e vorrei visualizzare i dati che inserisco da tastiera ma ho qualche problema nella visualizzazione . In pratica se dichiaro una variabile di tipo studente e inserisco i dati richiesti all'atto dell'output mi ritorna i parametri di default di nome cognome ed età mentre facoltà e matricola sono visualizzati correttamente.Come mai?
Ecco il codice che ho modificato:
File persona.h
codice:
#ifndef PERSONA_H_
#define PERSONA_H_
#include <iostream>
using namespace std;
class persona{
protected:
char * nome;
char * cognome;
short int eta;
public:
persona(const char * n="",const char * c="",const short int e=0)
{cout<<"costruttore base chiamato!\n"; nome=new char[strlen(n)+1];strcpy(nome,n);cognome=new char[strlen(c)+1];strcpy(cognome,c);eta=e;}
persona(const persona &);
const persona & operator=(const persona &);
virtual~persona(){cout<<"distruttore base chiamato!\n";delete [] nome; delete [] cognome;}
const char *get_nome()const {return nome;}
const char *get_cognome() const {return cognome;}
short int get_eta() const {return eta;}
void set_nome(const char * N) {delete [] nome; nome=new char[strlen(N)+1];strcpy(nome,N);}
void set_cognome(const char * C) {delete [] cognome;cognome=new char[strlen(C)+1];strcpy(cognome,C);}
void set_eta(const short int E) {eta=E;}
void inserisci_persona() const;
virtual void visualizza_dati() const;
};
#endif
File persona.cpp
codice:
#include <iostream>
#include "persona.h"
using namespace std;
persona::persona(const persona & T)
{
nome=new char[strlen(T.nome)+1];
strcpy(nome,T.nome);
cognome=new char[strlen(T.cognome)+1];
strcpy(cognome,T.cognome);
eta=T.eta;
}
const persona & persona::operator=(const persona & T)
{
if(this!=&T)
{
if(nome) delete [] nome;
nome=new char[strlen(T.nome)+1];
strcpy(nome,T.nome);
if(cognome) delete [] cognome;
cognome=new char[strlen(T.cognome)+1];
strcpy(cognome,T.cognome);
eta=T.eta;
}
return *this;
}
void persona::inserisci_persona() const
{
char buffer[100];
persona P;
short int temp;
cout<<"Inserisci nome ";
cin.getline(buffer,99);
P.set_nome(buffer);
cout<<"Inserisci cognome ";
cin.getline(buffer,99);
P.set_cognome(buffer);
cout<<"Inserisci eta' ";
cin>>temp;
P.set_eta(temp);
}
void persona::visualizza_dati() const
{
cout<<"**************************\n";
cout<<"Nome: "<<nome<<"\n";
cout<<"Cognome: "<<cognome<<"\n";
cout<<"Eta': "<<eta<<"\n";
}
File studente.h
codice:
#ifndef STUDENTE_H_
#define STUDENTE_H_
#include <iostream>
#include "persona.h"
#include <string>
using namespace std;
class studente:public persona{
private:
string facolta;
string matricola;
public:
studente(const char* n="a",const char * c="a",const short int e=0,const string f="",const string m=""):persona(n,c,e)
{cout<<"costruttore derivato chiamato!\n";facolta=f;matricola=m;}
studente(const studente &);
const studente & operator=(const studente &);
void set_facolta(const string F) {facolta=F;}
void set_matricola(const string M) {matricola=M;}
const string get_facolta() const {return facolta;}
const string get_matricola() const {return matricola;}
virtual void visualizza_dati()const;
friend istream & operator>>(istream&, studente &);
};
#endif
File studente.cpp
codice:
#include <iostream>
#include "studente.h"
using namespace std;
studente::studente(const studente & S) : persona(S)
{
facolta=S.facolta;
matricola=S.matricola;
}
const studente & studente::operator=(const studente & S)
{
if(this!=&S)
{
persona::operator=(S);
facolta=S.facolta;
matricola=S.matricola;
}
return *this;
}
void studente::visualizza_dati()const
{
persona::visualizza_dati();
cout<<"Facolta': "<<facolta<<endl;
cout<<"Matricola: "<<matricola<<endl;
}
istream& operator>>(istream& is,studente & S)
{
char buffer[100];
persona p1;
p1.inserisci_persona();
is.ignore();
cout<<"Inserisci facolta' ";
is.getline(buffer,99);
S.facolta=buffer;
cout<<"Inserisci numero di matricola ";
is>>S.matricola;
return is;
}
File main.cpp
codice:
#include <cstdlib>
#include <iostream>
#include "studente.h"
using namespace std;
int main(int argc, char *argv[])
{
studente c1;
cin>>c1;
cin.ignore();
c1.visualizza_dati();
system("PAUSE");
return EXIT_SUCCESS;
}