C++ – Interazione fra oggetti
A questo punto si può riscrivere il programma per la gestione dei prestiti della biblioteca, nel quale interagiranno oggetti di tipo libro ed oggetti di tipo libreria, cominciando dalla funzione main:
// PRESTITI2: gestione prestiti libri di una biblioteca versione 2
#include <iostream>
#include <string>
using namespace std;
#include "c_libro" /*1*/
#include "c_libreria" /*1*/
namespace biblioteca{
libreria insertLibri(); /*2*/
void prestito(libreria&); /*2*/
void restituzione(libreria&); /*2*/
void info(libreria); /*2*/
}
int main()
{
biblioteca::libreria biblio; /*3*/
int tipoop;
// Gestione prestiti libri
biblio = biblioteca::insertLibri();
for(;;){
cout << "\n1 - prestito";
cout << "\n2 - restituzione";
cout << "\n3 - info libro";
cout << "\n0 - fine";
cout << "\nOperazione ? ";
cin >> tipoop;
if(!tipoop) break;
switch (tipoop){
case 1:
biblioteca::prestito(biblio);
break;
case 2:
biblioteca::restituzione(biblio);
break;
case 3:
biblioteca::info(biblio);
break;
default:
cout << "Inserire 1,2,3 o 0";
}
}
return 0;
}
Per mezzo delle 1 si includono nel file le definizioni delle classi. Si noti che la classe contenuta in c_libro è inclusa anche nella definizione della classe contenuta in c_libreria. La definizione sarebbe duplicata se non fosse condizionata all’esistenza della variabile C_LIBRO che, quando richiamata da c_libreria, è già definita.
Le funzioni il cui prototipo è in 2, richiedono come parametro un oggetto di tipo libreria che è definito nello stesso spazio di nomi e, quindi, conosciuto. Cosa non valida nella dichiarazione dell’oggetto in 3 che ha necessità di specificare l’operatore di visibilità.
Dichiarazione della 3 a parte, il resto della funzione main coincide con quello della stessa funzione in PRESTITI1 tranne per il fatto che la funzione di inserimento di libri ora torna un oggetto della classe libreria. D’altra parte il main si occupa soltanto di presentare il menù di scelta e richiamare le funzioni di gestione.
// Registrazione libri nella biblioteca
biblioteca::libreria biblioteca::insertLibri() /*1*/
{
biblioteca::libreria l;
biblioteca::libro libtemp;
biblioteca::datilib l1;
int n,i;
cout << "Quanti libri? ";
cin >> n;
cin.ignore();
for (i=0;i<n;i++){
cout << "Libro in posizione n. " << i << endl;
cout << "Titolo ->";
getline(cin,l1.titolo);
cout << "Autore ->";
getline(cin,l1.autore);
cout << "Editore ->";
getline(cin,l1.editore);
cout << "Prezzo ->";
cin >> l1.prezzo;
cin.ignore();
libtemp.setLibro(l1);
l.aggiungi(libtemp); /*2*/
}
return l; /*1*/
}
La funzione di inserimento dei libri è quasi del tutto coincidente con la corrispondente della versione precedente del programma di gestione della biblioteca. L’unica differenza è che, stavolta, viene tornato indietro (1) un valore di tipo libreria e l’inserimento del libro viene effettuato nella 2 inviando il messaggio aggiungi alla libreria e passandogli il libro da aggiungere.
// Prestito di un libro
void biblioteca::prestito(libreria& l) /*1*/
{
int quale,posultimo;
biblioteca::libro lib;
posultimo = l.dotazione()-1; /*2*/
cout << "\nQuale libro (0," << posultimo << ")? ";
cin >> quale;
if (l.estrai(quale,lib)){ /*3*/
if(lib.prestato()){ /*4*/
l.aggiorna(quale,lib); /*5*/
cout << "\nPrestito registrato" << endl;
}
else
cout << "\nLibro non presente" << endl;
}
else
cout << "\nLibro inesistente" << endl;
}
// Restituzione di un libro prestato
void biblioteca::restituzione(libreria& l) /*1*/
{
int quale,posultimo;
biblioteca::libro lib;
posultimo = l.dotazione()-1; /*2*/
cout << "\nQuale libro (0," << posultimo << ")? ";
cin >> quale;
if (l.estrai(quale,lib)){ /*3*/
if(lib.restituito()){ /*4*/
l.aggiorna(quale,lib); /*5*/
cout << "\nRestituzione registrata" << endl;
}
else
cout << "\nLibro non in prestito" << endl;
}
else
cout << "\nLibro inesistente" << endl;
}
Le funzioni per le operazioni di prestito e restituzione ricevono come parametro un oggetto di tipo libreria su cui operare (1), calcolano la posizione dell’ultimo libro inserito (2) chiamando il metodo dotazione della libreria, estraggono dalla libreria il libro desiderato se esiste, verificando il valore ritornato dal metodo (3), effettuano l’operazione richiesta sul libro (4), aggiornano (5), infine, i dati del libro nella libreria (ripongono il libro nella libreria).
// Informazioni su libro
void biblioteca::info(libreria l) /*1*/
{
biblioteca::libro lib;
biblioteca::datilib l1;
int quale,posultimo;
posultimo = l.dotazione()-1;
cout << "\nQuale libro (0," << posultimo << ")? ";
cin >> quale;
if(l.estrai(quale,lib)){ /*2*/
cout << lib; /*3*/
}
else
cout << "Libro inesistente" << endl;
}
La funzione di visualizzazione dei dati di un libro, estrae (2), dalla libreria passata come parametro (1), il libro interessato e ne stampa (3) i dati.
Indice corso: C++ Appunti di Programmazione Fonte: prof. Nunzio Brugaletta
