Chiarimento dubbi C++
Salve ragazzi...ho cominciato da poco a trattare il c++ ..purtroppo non mi sono chiare alcune cose . Prendendo di esempio questa piccola esercitazione , dove ho diviso il file.h e le implementazioni dei metodi
Il mio problema è che non capisco come applicare questi metodi nel main...cioè come applicare quei metodi . Per esempio ho utilizzato il costruttore "esame()" il quale mi permette di inserire il nome e il voto dell'esame...Poi ho richiamato il metodo "visualizzaEsame()" , ma non mi restituisce il nome dell'esame che ho inserito poco prima...sto facendo molta confusione..
#define _ESAME_H
#include<iostream>
#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
string getEsame();
void setEsame(); // imposta il nome dell'esame;
int getVoto(int); // restituisce il voto
void setVoto() ;// imposta il voto dell'esame
void visualizzaVoto();
void visualizzaEsame();
private:
string NomeEsame;
int voto;
bool sostenuto;
};
#endif _ESAME_H
#include<iostream>
#include <string>
#include "esame.h"
using namespace std;
esame::esame()
{
esame(NomeEsame,voto);
}
esame::esame(string NomeEsame)
{
cout<<"Inserire il nome dell'esame: ";
cin>>NomeEsame;
}
esame::esame(string NomeEsame,int voto)
{
cout<<"Inserire il nome dell'esame: ";
cin>>NomeEsame;
cout<<endl;
cout<<"Inserire il voto dell'esame specificato: ";
cin>>voto;
}
string esame::getEsame()
{
return NomeEsame;
}
void esame::setEsame()
{
cout<<"Inserire il nome dell'esame: ";
cin>>NomeEsame;
}
void esame::setVoto()
{
cout<<"Inserire il voto dell'esame: ";
cin>>voto;
}
void esame::visualizzaEsame()
{
cout<<"L'esame è :"<<NomeEsame;
}
void esame::visualizzaVoto()
{
cout<<"L'esame è :";
cout<<NomeEsame;
}
Il mio problema è che non capisco come applicare questi metodi nel main...cioè come applicare quei metodi . Per esempio ho utilizzato il costruttore "esame()" il quale mi permette di inserire il nome e il voto dell'esame...Poi ho richiamato il metodo "visualizzaEsame()" , ma non mi restituisce il nome dell'esame che ho inserito poco prima...sto facendo molta confusione..
Risposte
Quella libreria è implementata malissimo. La presenza di visualizzaEsame e visualizzaVoto è insensata in presenta di getEsame e getvoto. I costruttori non fanno quello che dovrebbero e le funzioni richiamano inutilmente le funzioni di iostream quando sarebbe meglio se gli inviassi direttamente i valori. Quindi in pratica è una libreria da buttare.
Ecco come avrebbe dovuto essere fatta:
Ovviamente ci sono altre cose che in realtà andrebbero aggiunte/modificate per renderla una utilizzabile ma ci avrei messo più tempo a farle.
Ecco come avrebbe dovuto essere fatta:
#ifndef _ESAME_H
#define _ESAME_H
#include <string>
class esame {
public:
esame(); // costruttore di default
esame(std::string const); // imposta il nome dell'esame
esame(std::string const, int const); //imposta nome e voto dell'esame
std::string const getEsame() const;
void setEsame(std::string const); // imposta il nome dell'esame;
int const getVoto() const; // restituisce il voto
void setVoto(int const) ;// imposta il voto dell'esame
private:
std::string NomeEsame;
int voto;
bool sostenuto;
};
#endif#include <string>
#include "esame.h"
esame::esame() {};
esame::esame(std::string const Nome) :
NomeEsame(Nome),
voto(0) {};
esame::esame(std::string const Nome, int const v) :
NomeEsame(Nome),
voto(v) {};
std::string const esame::getEsame() const
{
std::string const ret(esame::NomeEsame);
return ret;
}
void esame::setEsame(std::string const Nome)
{
esame::NomeEsame = Nome;
}
void esame::setVoto(int const v)
{
esame::voto = v;
}
int const esame::getVoto() const
{
int const v = esame::voto;
return v;
}
Ovviamente ci sono altre cose che in realtà andrebbero aggiunte/modificate per renderla una utilizzabile ma ci avrei messo più tempo a farle.
Grazie per i consigli ..ma volevo capire alcune cose :
1) perchè hai utilizzato std al posto di nominare using namespace std
2) il motivo dell'utilizzo di 3 costruttori ..non posso utilizzarne solo uno ?
1) perchè hai utilizzato std al posto di nominare using namespace std
2) il motivo dell'utilizzo di 3 costruttori ..non posso utilizzarne solo uno ?
Inoltre definendo una classe derivata del tipo
se voglio implementare il costruttore studente(string const,string const...) , ovvero il costruttore che assegna il nome a ciascun elemento del vettore " esami libretto[5] " ..come faccio ? ..
ifndef _STUDENTE_H
#define _STUDENTE_H
#include <iostream>
#include "esame.h"
#include <string>
using namespace std;
class studente:protected esame
{
protected:
int matricola;
esame libretto[5];
int media;
public:
studente();
studente(string const,string const,string const , string const ,string const);
void setMatricola(int const); // imposta la matricola dello studente
void setEsame(string const); // imposta il nome dell'iesimo esame
int const getEsame(); // restituisce il nome dell'i-esimo esame
bool getSostenuto(int);// restituisce se l'i-esimo esame è stato sostenuto
int mediaEsami();
void printStudente() ;// visualizza tutte le informazioni dello studente !
};
#endif
se voglio implementare il costruttore studente(string const,string const...) , ovvero il costruttore che assegna il nome a ciascun elemento del vettore " esami libretto[5] " ..come faccio ? ..
"slevyn":
Grazie per i consigli ..ma volevo capire alcune cose :
1) perchè hai utilizzato std al posto di nominare using namespace std
2) il motivo dell'utilizzo di 3 costruttori ..non posso utilizzarne solo uno ?
1) Beh, ci sono buone ragioni per non introdurre tutto il namespace std ma scrivere std:: in ogni caso più che usare using namespace std sarebbe meglio usare introdurre solo quelli che effettivamente usi. In alcuni casi lavori su namespace che hanno definito funzioni e classi con lo stesso nome e quindi separare i namespace è meglio. Ma forse non sai esattamente neanche cos'è un namespace e quindi sono cose per il futuro
2) puoi definirne anche uno solo
"slevyn":
Inoltre definendo una classe derivata del tipo
ifndef _STUDENTE_H #define _STUDENTE_H #include <iostream> #include "esame.h" #include <string> using namespace std; class studente:protected esame { protected: int matricola; esame libretto[5]; int media; public: studente(); studente(string const,string const,string const , string const ,string const); void setMatricola(int const); // imposta la matricola dello studente void setEsame(string const); // imposta il nome dell'iesimo esame int const getEsame(); // restituisce il nome dell'i-esimo esame bool getSostenuto(int);// restituisce se l'i-esimo esame è stato sostenuto int mediaEsami(); void printStudente() ;// visualizza tutte le informazioni dello studente ! }; #endif
se voglio implementare il costruttore studente(string const,string const...) , ovvero il costruttore che assegna il nome a ciascun elemento del vettore " esami libretto[5] " ..come faccio ? ..
A che ti serve imporre le variabili come protected? Puoi lavorare tranquillamente con le variabili private. Inoltre direi che sarebbe meglio usare un vector di esami (anche se a seconda degli usi potrebbe essere meglio creare una classe libretto che gestisca il libretto) più che un array.
Riguardo invece al costruttore direi che è meglio se crei solo un costruttore di default e poi gli esami li aggiungi dopo.
Grazie per le risposte..un ultima cosa è come gestire le derivazione ...ovvero che modalità di accesso imporre per esempio alle due classi Esame e Studente che ho prima linkato
Non c'è nessuna ragione di derivare: uno studente non è un esame ma possiede un libretto che contiene esami. Quindi il loro legame è solo Studenti possiede un array (o ancora meglio un vector) di tipo esame.