Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1

    [c++]composizione di classi e costruttori

    salve a tutti, complimenti per l'ottimo forum.
    ho appena iniziato a studiare il c++ e sono arrivato alla composizione di classi solo che sono pieno di dubbi ora su un'esercitazione.
    composizione di classe studente con classe esami. soprattutto sui costruttori e dell'uso dei metodi nel main.
    estratto dalla traccia:
    metodi:costruttore di default studente(): imposta i nomi di default dei 5 esami e i rispettivi flag sostenuto a false
    costruttore studente(nome1, nome2, nome3, nome4, nome5): imposta in nomi dei 5 esami usando i parametri nome1, ... e i rispettivi flag sostenuto a false
    setMatricola, setNome, getMatricola, getNome
    setEsame(Voto,i): imposta il voto dell'esame i-esimo
    getVotoEsame(i), getNomeEsame(i), getSostenuto(i)
    getMedia(): restituisce la media degli esami sostenuti
    printStudente(): visualizza tutte le informazioni dello studente compresi gli esami sostenuti e i rispettivi voti
    campi di esemplare
    matricola: string
    nome: string
    esami: vettore di 5 esami
    classe esame già creata ma nn so come implementare i costruttori.
    codice:
    studente(); /*studente(esame nome1, esame nome2, esame nome3, esame nome4, esame nome5);*/
    questo nel .h...e nel .cpp come implemento questi costruttori?
    mi scuso nel caso in cui non sia stato chiaro e ringrazio chi potrà dedicarmi qualche minuto di attenzione.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Mostra il codice che hai scritto, così si ha modo di chiarire i vari dubbi (altrimenti la vedo un po' dura).
    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
    per prima cosa grazie della risp in ogni caso...
    questo è il codice dove ci saranno un'infinità di errori perchè ho da poco iniziato
    quindi grazie 1000 in anticipo per qualsiasi eventuale suggerimento.
    esame.h
    codice:
    #ifndef ESAME_H #define ESAME_H #include <string> using namespace std; class esame{ public: esame();//costruttore di default esame(string);//imposta il nome dell'esame esame(string, int);//imposta nome e voto dell'esame esame(string, bool);/*imposta nome e sostenuto*/ void setesame(string); void setvoto(int); string getesame(); int getvoto(); bool issostenuto(string); private: string nome_esame; bool sostenuto; int voto; }; #endif
    esame.cpp

    codice:
    #include <cstdlib> #include <iostream> #include <string> #include "esame.h" using namespace std; //costruttore esame::esame(){cout << "crea Esame" << endl;} esame::esame(string){ nome_esame="nome esame"; } esame::esame(string nome_esame, int voto){ nome_esame="nome esame"; voto = 0; } esame::esame(string nome_esame, bool sost){ nome_esame="nome esame"; sost=false; } /*definizione funzioni*/ //imposta nome dell'esame void esame::setesame(string nome) { cout << "Inserire il nome dell'esame: "; cin >> nome_esame; } //legge il nome dell'esame string esame::getesame() { return nome_esame; } //imposta il voto void esame::setvoto(int v) { voto=v; } //leggi voto int esame::getvoto() { return voto; } //controllo esame sostenuto bool esame::issostenuto(string c) { if(c==nome_esame) return true; return false; }
    studente.h
    codice:
    #ifndef STUDENTE_H #define STUDENTE_H #include <string> #include "esame.h" using namespace std; class studente { public: studente(); /*studente(esame nome1, esame nome2, esame nome3, esame nome4, esame nome5);*/ void setMatricola(string); void setNome(string); string getMatricola(); string getNome(); private: string matricola; string nome_stud; esame esami[5]; //const int numesami; }; #endif
    studente.cpp
    codice:
    #include <iostream> #include <string> #include "esame.h" #include "studente.h" using namespace std; studente::studente() :esami() /*:studente(esame nome1, esame nome2, esame nome3, esame nome4, esame nome5)*/ {cout << "crea studente" << endl; } void studente::setMatricola(string matricola_stud) { matricola=matricola_stud; } void studente::setNome(string nom) { nome_stud=nom; } string studente::getMatricola() { return matricola; } string studente::getNome() { return nome_stud; }

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Non è che il codice in una unica riga sia molto leggibile, quindi in futuro ricordati di identarlo meglio.

    Detto questo:
    A mio avviso i costruttori da usare per Esame sono questi (riporto solo quelli) :
    codice:
    class esame{ 
        public: 
            esame(); //costruttore di default 
    	esame(string); //imposta il nome dell'esame 
    	esame(string, int, bool); //imposta nome, voto dell'esame e se è sostenuto
        private: 
            string nome_esame; 
    	bool sostenuto; 
    	int voto; 
    }; 
    
    esame::esame() {
        nome_esame = "";
        voto=0;
        sostenuto=false;
    } 
    
    esame::esame(string esame_nome){ 
        nome_esame=esame_nome; 
        voto=0;
        sostenuto=false;
    } 
    
    esame::esame(string esame_nome, int votazione, bool fatto){ 
        nome_esame=esame_nome; 
        voto=votazione;
        sostenuto=fatto;
    }
    Il primo costruttore ti permette di creare un esame vuoto (devo fare un esame).
    Il secondo ti permette di definire che tipo di esame (devo fare un esame di matematica)
    Il terzo ti permette di definire un esame, il suo esito e se è sostenuto (ho fatto un esame di matematica con esito 10).
    Tradotto:
    codice:
    Esame e0;
    Esame e1("matematica");
    Esame e2("matematica,10,true);
    Il costruttore di Studente sarà:
    codice:
    studente::studente(esame nome1, esame nome2, esame nome3, esame nome4, esame nome5) {
        esami[0] = nome1;
        esami[1] = nome2;
        esami[2] = nome3;
        esami[3] = nome4;
        esami[4] = nome5;
    }
    che potrai richiamare con:
    codice:
    Studente pippo(Esame("materia1"), Esame("materia2"),Esame(), Esame("materia4",5,true),Esame());
    Intendendo che pippo deve dare: materia1,materia2, un esame da definire, ha già dato materia4, altro esame da definire.
    In alternativa puoi scrivere:
    codice:
    Esame e1("materia1");
    Esame e2("materia2");
    Esame e3;
    Esame e3("materia4",5,true);
    Esame e5;
    Studente pippo(e1,e2,e3,e4,e5);
    Il corpo del costruttore di default di Studente va lasciato vuoto in quanto l'array di esami da fare verrà automaticamente inizializzato, elemento per elemento, con il costruttore di default di Esame (che imposterà i parametri di default).
    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.

  5. #5
    grazie per l'interessamento la pazienza e la precisione e scusa per l'indentazione...è la prima volta che scrivo in un forum di programmazione e pensavo che la indentasse automaticamente...ora provo a lavorarci un po sù e sicuramente mi usciranno altri dubbi da postare!!!
    anche se sono alle primissime armi...grazie e a buon rendere!

  6. #6
    nella classe studente ho un dato membro int const numesami che deve darmi sempre 5 nel mio caso.
    come faccio ad inizializzarlo? lo devo fare in tutti i costruttori?
    tipo nei costruttori(compreso quello di default) scrivere:
    int const numesami=5;

    grazie anticipatamente per l'aiuto...

  7. #7
    il dev mi suggerisce di dichiararlo cosi
    static const int numesami=5;
    senza nessuna inizializzazione nei costruttori e funziona...anche se non ho capito quello static perchè mi risolve il problema.

  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Una variabile static esiste al di fuori di una specifica istanza di quella classe, quindi ci puoi accedere sempre (se public) con la sintassi:

    nome_classe::nome_variabile.

    E' un meccanismo del C++ che si usa quando si vuole avere una variabile il cui valore è condiviso da tutte le istanze di quella classe. Segue le regole di scope (public, protected, private) e se non è una costante (come nel tuo caso) è obbligatorio inizializzarla fuori dal corpo della classe.
    codice:
    class Qualcosa {
        private:
            static int valore;
            static const int altro_valore = 5; // ok
    };
    
    int Qualcosa::valore = 0; // ok
    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.

  9. #9
    grazie della spiegazione quindi ne approfitto :P
    il dato membro numesami è costante cioè sempre uguale a 5.
    se lo dichiaro come dato private nel .h cosi: const int numesami;
    poi nel .cpp lo inizializzo nei due costruttori della classe mi da errore proprio perchè non è inizailizzato nei costruttori...
    questo:
    static const int numesami=5;
    l'ho scritto sempre private e mi funziona con tutte le istanze di classe...
    lo so forse sono un po confusionario perchè ho inziato da poco a programmare
    la domanda è:
    posso non usare lo static?
    e in che modo dovrei inizializzare questo numesami?
    grazie ancora per la pazienza
    utilissimo forum

  10. #10
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Solo così:
    codice:
    class Qualcosa {
        public:
           Qualcosa() : valore(5) {}
        private:
            const int valore;
    };
    ogni altra idea provoca errore.
    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.

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.