PDA

Visualizza la versione completa : [c++]composizione di classi e costruttori


marcospider82
14-12-2011, 10:56
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.

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.

shodan
14-12-2011, 12:42
Mostra il codice che hai scritto, così si ha modo di chiarire i vari dubbi (altrimenti la vedo un po' dura).

marcospider82
14-12-2011, 13:41
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

#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


#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

#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

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

shodan
14-12-2011, 18:06
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) :


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:


Esame e0;
Esame e1("matematica");
Esame e2("matematica,10,true);

Il costruttore di Studente sarà:


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:


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:


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).

marcospider82
14-12-2011, 18:23
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!

marcospider82
17-12-2011, 11:55
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...

marcospider82
17-12-2011, 12:07
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.

shodan
17-12-2011, 12:30
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.


class Qualcosa {
private:
static int valore;
static const int altro_valore = 5; // ok
};

int Qualcosa::valore = 0; // ok

marcospider82
17-12-2011, 12:54
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 :)

shodan
17-12-2011, 13:16
Solo così:


class Qualcosa {
public:
Qualcosa() : valore(5) {}
private:
const int valore;
};


ogni altra idea provoca errore.

Loading