| prof. Nunzio Brugaletta |
C++:
programmazione e oggetti |
Viene presentato, di seguito, il file c_libro nel quale è implementata, estendendola rispetto alla presentazione contenuta in un precedente paragrafo, la classe libro per la gestione dei prestiti in una biblioteca:
namespace biblioteca{ /*1*/
struct datilib{ /*2*/
string titolo;
string autore;
string editore;
float prezzo;
};
class libro{ /*3*/
public:
void setLibro(datilib); /*4*/
bool getInPrestito() const {return presente;}; /*4*/
bool prestato(); /*5*/
bool restituito(); /*5*/
friend ostream& operator<<(ostream&, const libro&); /*6*/
protected:
datilib libbib; /*7*/
bool presente; /*8*/
};
// overloading operatore inserimento
ostream& operator<<(ostream& output, const libro& l1)
{
output << l1.libbib.titolo << " | " << l1.libbib.autore << " | "
<< l1.libbib.editore << " | " << l1.libbib.prezzo;
if(l1.presente)
cout << "\nLibro presente" << endl;
else
cout << "\nLibro in prestito" << endl;
return output;
};
// Implementazione metodi della classe
void libro::setLibro(datilib lset) /*9*/
{
libbib = lset; /*10*/
presente=true; /*11*/
}
// Operazioni di prestito
bool libro::prestato() /*9*/
{
bool prestitoOk=false;
if (getInPrestito()){
presente = false;
prestitoOk = true;
};
return prestitoOk;
}
bool libro::restituito() /*9*/
{
bool ritornatoOk=false;
if (!getInPrestito()){
presente = true;
ritornatoOk = true;
};
return ritornatoOk;
}
}
Tutta la definizione della classe è definita nello spazio di nomi biblioteca (1).
Nella 2 è definita una struttura di tipo datilib: l'insieme di dati che compongono un libro, l'anagrafica del libro.
Nella 3, invece, il libro diventa una entità su cui si svolgono determinate operazioni e non solo un insieme di dati. La modifica sostanziale è indicata anche dai nomi utilizzati per le variabili: da datilib (dati del libro) a libro (libro in una biblioteca). D'altra parte anche nel mondo reale il modo di agire è abbastanza simile: si registrano i dati del libro e quindi si inserisce il libro nelle disponibilità della biblioteca.
Per poter assolvere ai compiti richiesti da un libro in una biblioteca è necessario, oltre che definire i dati che compongono il libro dal punto di vista dell'utilizzatore della classe (7), anche dati (8) gestiti internamente alla classe stessa. In ogni caso tutti i dati, al solito, sono definiti nella parte protected della classe, accessibili alle classi derivate, e sono gestiti dai metodi pubblici definiti nella stessa.
Fra i metodi pubblici sono definiti alcuni di tipo set e get (4), rispettivamente, per l'inserimento di dati (un libro come insieme di dati diventa un oggetto, un libro della biblioteca) e per la conoscenza della disponibilità del libro, oltre che (5) metodi specifici degli oggetti che interessano. La 6 ridefinisce l'operatore di inserimento per gli oggetti della classe. La presenza del qualificatore const nel metodo getInPrestito da una parte indica il fatto che il metodo non modifica i dati della classe (si tenga presente che anche se non esplicitato è come se i dati della classe fossero passati come parametro per riferimento alla funzione), dall'altra garantisce da possibili errori di modifica involontaria di qualche dato: il compilatore non permetterebbe l'operazione.
Nell'implementazione dei metodi (9) è utilizzato l'operatore di visibilità :: per poter accedere a tutti i dati della classe.
Le operazioni sul libro da gestire nella biblioteca prevedono, fra le altre, la conservazione dei dati del libro (10) e il settaggio della variabile presente (11) ad indicare la disponibilità, al prestito, del libro stesso.
I metodi 5 implementano le operazioni ammissibili per i libri. Come si nota nelle definizioni, si tratta, sostanzialmente, di modificare l'attributo presente.
| http://ennebi.solira.org |
ennebi@solira.org |