Salve a tutti stavo implementando un semplice codice per imparare ad usare il concetto di ereditarietà nelle classi. In particolare il codice riguarda una classe persona che contiene varie funzioni get e set nella sua parte pubblica e in quella protetta nome cognome ed età.Tale classe è la classe base. La classe derivata invece riguarda uno studente che eredita tutte le funzioni di persona e in più qualche altra funzioni sempre di tipo get e set per essa.Il problema sta ne file main dove se dichiaro una variabile di tipo studente mi da questo tipo di errore:
mentre se dichiaro una variabile di tipo persona va tutto bene. Come mai grazie mille a tutti per le risposte!codice:ereditarietà\main.cpp no matching function for call to `studente::studente()'
Questo è il codice:
File persona.h
File persona.cppcodice:#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 &); ~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) {if(cognome) delete [] cognome;cognome=new char[strlen(C)+1];strcpy(cognome,C);} void set_eta(const short int E) {eta=E;} void inserisci_persona() const; void visualizza_persona() const; }; #endif
File studente.hcodice:#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_persona() const { cout<<"Visualizzazione dati persona\n"; cout<<"Nome: "<<nome<<"\n"; cout<<"Cognome: "<<cognome<<"\n"; cout<<"Eta': "<<eta<<"\n"; }
File studente.cppcodice:#ifndef STUDENTE_H_ #define STUDENTE_H_ #include <iostream> #include "persona.h" using namespace std; class studente:public persona{ private: char *facolta; int matricola; public: studente(const char* n="",const char * c,const short int e=0,const char* f="",const int m=0):persona(n,c,e) {cout<<"costruttore derivato chiamato!\n";facolta=new char[strlen(f)+1];matricola=m;} studente(const studente &); const studente & operator=(const studente &); ~studente() {delete [] facolta;} void set_facolta(const char * F) {if (facolta) delete [] facolta; facolta=new char[strlen(F)+1];strcpy(facolta,F);} void set_matricola(const int M) {matricola=M;} const char * get_facolta() const {return facolta;} int get_matricola() const {return matricola;} void inserisci_studente() ; void visualizza_studente() const; }; #endif
codice:#include <iostream> #include "studente.h" using namespace std; studente::studente(const studente & S) : persona(S) { cin.ignore(); facolta=new char[strlen(S.facolta)+1]; strcpy(facolta,S.facolta); matricola=S.matricola; } const studente & studente::operator=(const studente & S) { if(this!=&S) { persona::operator=(S); if(facolta) delete [] facolta; facolta=new char[strlen(S.facolta)+1]; strcpy(facolta,S.facolta); matricola=S.matricola; } return *this; } void studente::visualizza_studente() const { persona::visualizza_persona(); cout<<"Visualizzazione dati studente\n"; cout<<"Facolta': "<<facolta<<"\n"; cout<<"Matricola: "<<matricola<<"\n"; } void studente::inserisci_studente() { char buffer[100]; int MA; studente s1; cout<<"Inserisci i dati di uno studente\n"; persona::inserisci_persona(); cin.ignore(); cout<<"Inserisci facolta' "; cin.getline(buffer,99); s1.set_facolta(buffer); cout<<"Inserire matricola "; cin>>MA; s1.set_matricola(MA); }codice:#include <cstdlib> #include <iostream> #include "studente.h" using namespace std; int main(int argc, char *argv[]) { studente c2; persona c1; system("PAUSE"); return EXIT_SUCCESS; }

Rispondi quotando
. E comunque si conosco la classe string però siccome sto preparando l'esame di programmazione 1 se nella traccia non mi viene esclusivamente detto di usare la classe string per gestire "dinamicamente" array di caratteri sono costretto a usare i char *
