Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C++]ereditarietà nelle classi

    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:
    codice:
    ereditarietà\main.cpp no matching function for call to `studente::studente()'
    mentre se dichiaro una variabile di tipo persona va tutto bene. Come mai grazie mille a tutti per le risposte!

    Questo è il codice:

    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 &);
                ~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 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_persona() const
    {
     cout<<"Visualizzazione dati persona\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"
    
    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
    File studente.cpp
    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;
    }

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    1) Se imponi parametri default ai costruttori, devi inserirli da destra a sinistra. In studente ne hai dimenticato uno (il secondo).

    2) Se conosci la classe std::string usala al posto dei char* nella definizione delle classi: ti risparmi un sacco di rogne.

    3) Una classe base deve avere sempre il distruttore virtuale.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Ecco dove stava l'errore! Grazie mille per la risposta . 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 *

  4. #4
    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;
    }

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Se non puoi usare la std::string non c'è problema, ma allora non usarla nella classe studente.
    Scegli un tipo di dato e adotta quello per coerenza, altrimenti è come uscire con ai piedi una scarpa diversa per piede. Possibile, ma inelegante.

    I dati poi li deve memorizzare la persona corrente, non una che non c'entra niente.

    codice:
    void persona::inserisci_persona() const
    {
        char buffer[100];
        short int temp;
        cout<<"Inserisci nome ";
        cin.getline(buffer,99);
        this->set_nome(buffer);
        cout<<"Inserisci cognome ";
        cin.getline(buffer,99);
        this->set_cognome(buffer);
        cout<<"Inserisci eta' ";
        cin>>temp;
        this->set_eta(temp);
    }
    
    istream& operator>>(istream& is,studente & S)
    {
     char buffer[100];
     S.inserisci_persona();
     is.ignore();
     cout<<"Inserisci facolta' ";
     is.getline(buffer,99);
     S.facolta=buffer;
     cout<<"Inserisci numero di matricola ";
     is>>S.matricola;
     return is;
    }
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  6. #6
    Bene grazie mille per tutto ti sono davvero grato per le risposte che mi hai dato

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.