Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16

Discussione: [C++] Classi ed errori

  1. #1

    [C++] Classi ed errori

    Salve a tutti,
    sto cercando di implementare un progetto in C++ sotto windows, mediante l'utilizzo di devc++.
    Il progetto è composto di un file header in cui sono dichiarate le classi:

    esami.h
    codice:
    #ifndef _DB_ESAMI
    #define _DB_ESAMI
    #include <iostream>
    #include <string>
    using std::string;
    class esame {
      public:
          esame();
          esame(string);
          esame(string,int);
          string getEsame();                   // restituisce il nome dell'esame 
          int getVoto();                       // restituisce il voto ottenuto per l'esame se sostenuto 
          void setVoto(int);                   // imposta il voto ottenuto per l'esame 
          void setEsame(string);               // imposta il nome dell'esame 
          void setSostenuto(bool);
          bool isSostenuto();            // restituisce true se l'esame è stato sostenuto 
           
      private:
          string nome_esame;
          bool sostenuto;
          int voto;
    };
    
    /*------------------------------------------------------*/
    
    class studente {
      public:
         studente(); //imposta i nomi di default dei 5 esami e i rispettivi flag sostenuto a false 
         studente(string, string, string, string, string); // imposta in nomi dei 5 esami usando i parametri nome1, ... e i rispettivi flag sostenuto a false 
         void setMatricola( string);
         void setNome(string );
         void setEsame(int ,int); // imposta il voto dell'esame i-esimo 
         string getMatricola();
         string getNome();
         int getNumEsami();  //restituisce 5 (numero massimo di esami da sostenere) 
         int getVotoEsame(int); 
         string getNomeEsame(int);
         bool getSostenuto(int) ;
         float getMedia();// restituisce la media degli esami sostenuti 
         void printStudente(string ); //visualizza tutte le informazioni dello studente compresi gli esami sostenuti e i rispettivi voti 
         
    
      private:
          string nome_studente;
          string matricola;
          int numero_esami; 
          esame esami[5];
    };
    
    /*------------------------------------------------------*/
    
    class studenti {
          public:
          studenti();
          void print_studenti();
                 
          private:
          studente stud[3];             
                  
    };
    
    #endif /* _DB_ESAMI */
    Di un sorgente che implementa i metodi, ma non ancora tutti gli ho sviluppati

    esami.cpp
    codice:
    #include "esami.h"
    esame::esame()
    {
       setVoto(0);                  
       setEsame("NULL"); 
       setSostenuto(false);
    }
    
    esame::esame(string nome_esame)
    {
       setVoto(0);                  
       setEsame(nome_esame); 
       setSostenuto(false);
    }
    
    esame::esame(string nome_esame,int voto_esame)
    {
       setVoto(voto_esame);                  
       setEsame(nome_esame); 
       setSostenuto(true);
    }
    
    string esame::getEsame()                   
    {
         return esame::nome_esame;
    }
    
    int esame::getVoto()                    
    {
         return esame::voto; 
    }
    
    void esame::setVoto(int votazione)
    {
         esame::voto=votazione;
         setSostenuto(true);
    }
    
    void esame::setEsame(string nome_e)               
    {
         esame::nome_esame=nome_e;
    }
    void esame::setSostenuto(bool sost)
    {
         esame::sostenuto=sost;
    }
    bool esame::isSostenuto()            
    {
         return esame::sostenuto;
    }
          
    /*---------------------------------------------------------------*/      
     
    studente::studente()
    {
       setNome("");
       setMatricola("");
       studente::numero_esami = 5;
                                 
    }
    
    studente::studente(string esame1, string esame2, string esame3, string esame4, string esame5) 
    {
       setNome("");
       setMatricola("");   
       studente::numero_esami = 5;
       
       esami[0].setEsame(esame1); 
       esami[1].setEsame(esame2); 
       esami[2].setEsame(esame3); 
       esami[3].setEsame(esame4); 
       esami[4].setEsame(esame5); 
           
    }
    
    void studente::setMatricola(string matr)
    {
         studente::matricola=matr;
    }
    void studente::setNome(string name)
    {
         studente::nome_studente=name;
    }
    void studente::setEsame(int num_esame ,int voto) 
    {
         esami[num_esame].setVoto(voto);
    }
    string studente::getMatricola()
    {
           return matricola;
    }
    string studente::getNome()
    {
           return nome_studente;
    }
    int studente::getNumEsami()  
    {
           return numero_esami;
    }
    int studente::getVotoEsame(int num_es)
    {
        return esami[num_es].getVoto;
    }
    string studente::getNomeEsame(int num_es)
    {
        return esami[num_es].getEsame;  
    }/*
    bool getSostenuto(int)
    {
          
    }
    float studente::getMedia()
    {
          
    }
    void studente::printStudente(string )
    {
         
    }
    
    /*---------------------------------------------------------------*/      
    /*
    studenti::studente()     
    {
    }
    void studenti::print_studenti()
    {
    }
    
    */
    Da un main per la prova dei metodi, anchesso non ancora del tutto completato

    main.cpp
    codice:
    #include "esami.h"
    
    using namespace std;
    int main(int argc, char *argv[])
    {
       esame asd;
       esame asd2("ASD2");
       esame asd3("ASD3",30);
    
       
       cout << "nome esame: " << asd.getEsame() << endl;
       cout << "voto: " << asd.getVoto() << endl;
       cout << "sostenuto: " << asd.isSostenuto() <<endl << endl;
       
       cout << "nome esame: " << asd2.getEsame() << endl;
       cout << "voto: " << asd2.getVoto() << endl;
       cout << "sostenuto: " << asd2.isSostenuto() <<endl << endl;
       
       cout << "nome esame: " << asd3.getEsame() << endl;
       cout << "voto: " << asd3.getVoto() << endl;
       cout << "sostenuto: " << asd3.isSostenuto() <<endl << endl;
       
       
        system("PAUSE");
    }
    Quando provo a compilare riscontro i seguenti errori:,
    codice:
     C:\Users\Neptune\Desktop\Asd\laboratorio\3-11-2010\esami.cpp In member function `int studente::getVotoEsame(int)': 
    102 C:\Users\Neptune\Desktop\Asd\laboratorio\3-11-2010\esami.cpp argument of type `int (esame::)()' does not match `int' 
     C:\Users\Neptune\Desktop\Asd\laboratorio\3-11-2010\esami.cpp In member function `std::string studente::getNomeEsame(int)': 
    106 C:\Users\Neptune\Desktop\Asd\laboratorio\3-11-2010\esami.cpp conversion from `<unknown type>' to non-scalar type `std::string' requested 
     C:\Users\Neptune\Desktop\Asd\laboratorio\3-11-2010\Makefile.win [Build Error]  [esami.o] Error 1
    Si riferiscono entrambi al file sulla dichiarazione dei metodi e la linea 102 riguarda la classe studente::getVotoEsame dove non fa altro che far ritornare "esami[num_es].getVoto;"

    la linea 106 si riferisce al metodo subito dopo, ovvero a studente::getNomeEsame, dove anche qui non fa altro che ritornare "esami[num_es].getEsame; ".

    Non riesco prorpio a capire che sono quei due errori perchè i tipi sembrano essere tutti giusti e non riesco a riscontrare altri generi di errori.

    Vi ringrazio in anticipo per ogni eventuale aiuto,
    Neptune.
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    getVoto è una funzione, getVoto() da un risultato.
    codice:
    int studente::getVotoEsame(int num_es)
    {
        return esami[num_es].getVoto();
    }
    etc.
    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
    Beh, gli errori sono qui:
    codice:
    return esami[num_es].getVoto;
    e qui
    codice:
    return esami[num_es].getEsame;
    getVoto e getEsame sono 2 funzioni, quindi devi richiamarle con

    codice:
    return esami[num_es].getVoto();
    e qui
    codice:
    return esami[num_es].getEsame();
    An infinite number of monkeys typing into GNU emacs would never make a good program.Linus Torvalds

  4. #4
    Mancano le parentesi di fianco al nome del metodo.
    codice:
    int studente::getVotoEsame(int num_es)
    {
        return esami[num_es].getVoto();
    }
    string studente::getNomeEsame(int num_es)
    {
        return esami[num_es].getEsame();  
    }
    ---EDIT---
    Azz, oggi sono lentissimo...
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Grazie mille, da solo non ci sarei arrivato.
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  6. #6
    Sempre sullo stesso programma, ovvero sulle classi che vi ho scritto prima, avrei un dubbio "pratico".

    Ovvero successivamente ho sviluppato tutte le classi e quindi ho una classe "Studenti" che rappresenta un vettore di "Studente", poi ho una classe Studente che contiene tutti i valori dello studente e dentro contiene anche un vettore di "Esame" e poi ho una classe esame con dentro tutti i valori riguardanti gli esami. Immagino sia un esempio pratico di incapsulamento.

    Ora se io devo andare a dichiarare un oggetto lo andrò a dichiarare magari di tipo "Studenti" in modo che mi si crei in un solo colpo tutta la struttura dati. Una volta creata però vorrò andare a scriverci dentro, ma come faccio contando che TUTTE le variabili sono private? (ovvero il vettore di studenti ed il vettore di esami?)

    Ovvero se dichiaro S1 di tipo Studenti e provo a dare il seguente comando:

    codice:
    sdi1.stud[0].esami[0].setEsame("Matematica Discreta");
    mi dirà "nonono esami è privata!".

    La cosa più veloce che mi sia venuta in mente per ovviare a questo problema è rendere i vettori pubblici. Questo perchè tanto il vettore poi sarà un insieme di "variabili" della classe che a loro volta saranno comunque private e quindi comunque l'utente sarà costretto ad utilizzare i metodi pubblici per accedervi, o sbaglio?

    Se invece questo rappresenta un problema di "sicurezza" ed il professore me li ha fatti dichiarare privati appositamente come altro potrei ovviare?

    L'unica alternativa che mi viene in mente è di creare in Studenti tutti i vari metodi del tipo "setNome, setMatricola, setNome_Esame, eccetera" in modo tale che poi sia la classe stessa ad accedere alle proprie variabili e così posso lasciarle private. Questo metodo però mi costerebbe la creazione di quei 5-6 metodi che poi non farebbero altro che richiamare a loro volta un'altro metodo e mi sembra uno spreco.

    Voi cosa consigliate? c'è qualche altra soluzione che mi sfugge?
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  7. #7
    codice:
    class studente
    {
        // ...
        esame & getEsame(size_t Index)
        {
            return esami[Index];
        }
        // ...
    };
    
    // ...
    sdi1.stud[0].GetEsame(0).setEsame("Matematica Discreta");
    Tutto questo funziona poiché viene restituito un reference, per cui le modifiche si ripercuotono sull'oggetto memorizzato nel vettore.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Originariamente inviato da MItaly
    codice:
    class studente
    {
        // ...
        esame & getEsame(size_t Index)
        {
            return esami[Index];
        }
        // ...
    };
    
    // ...
    sdi1.stud[0].GetEsame(0).setEsame("Matematica Discreta");
    Tutto questo funziona poiché viene restituito un reference, per cui le modifiche si ripercuotono sull'oggetto memorizzato nel vettore.
    Ho visto che funziona ma come fa?
    Cioè quella funzione "GetEsame(0)" come hai detto tu riporta il reference del vettore esame, ma come faccio ad accedere all'array "stud" che è anch'esso privato?

    Mi spieghi un pochino meglio il funzionamento?
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  9. #9
    Ah difatti cancellando i vecchi file oggetto (ogni tanto il dev lo fa questo scherzetto) in cui avevo messo stud come variabile pubblica non va più.

    Quindi ho risolto cosi, in Studenti ho implementato questo metodo:

    codice:
    studente & GetStudente(size_t Index)
          {
             return stud[Index];
          }
    e in studente quello scritto da te ovvero questo:

    codice:
    esame & GetEsame(size_t Index)
        {
            return esami[Index];
        }
    e la mia istruzione nel main diventa questa

    codice:
    sdi1.GetStudente(0).GetEsame(0).setEsame("Matematica Discreta");
    E sembra funzionare tutto.
    Ma di preciso come fa a funzionare? ad esempio l'intestazione del metodo "esame & GetEsame(size_t Index)" che significa? cioè "esame" deve essere la classe a cui ci riferiamo, poi un nome di metodo da noi inventato e "size_t" per cosa sta?
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  10. #10
    Tra l'altro sto provando ad implementarli invece che nel file .h, ovvero nella dichiarazione della classe, nel file .cpp dove ho dichiarato tutti gli altri metodi in questo modo:

    codice:
    //metodo per referenziarsi alla variabile privata stud
    studenti::studente & studenti::GetStudente(size_t Index)
          {
             return stud[Index];
          }
    ma mi da i seguenti errori:
    codice:
    160 C:\Users\Neptune\Desktop\Asd\laboratorio\3-11-2010\esami.cpp expected constructor, destructor, or type conversion before '&' token 
    160 C:\Users\Neptune\Desktop\Asd\laboratorio\3-11-2010\esami.cpp expected `,' or `;' before '&' token
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

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.