mercoledì 24 ottobre 2012

Impostare i livelli di accesso

Come le funzioni, gli oggetti possono essere trattati come entità incapsulate. Questo vuol dire in generale, che è meglio evitare la modifica diretta o l'accesso ai dati membro. Invece è consigliabile chiamare una funzione membro, permettendo all'oggetto di mantenere i propri membri dati ed assicurarne l'integrità. Fortunatamente, è possibile rafforzare le restrizioni ai dati membro quando viene definita la classe impostandone i livelli di accesso.

Presentare il programma Roditore privato

Il programma Roditore privato dimostra i livelli di accesso ai membri della classe, introducendo nella classe Roditore una restrizione ai livello di accesso che costituiscono il suo livello di fame. La classe fornisce due funzioni membro, una che permette l'accesso ai dati e l'altra che permette di modificarli. Il programma crea un nuovo roditore e indirettamente accede e modifica il livello di fame del roditore attraverso queste funzioni. Comunque, quando il programma tenta di modificare il valore di fame, usando un valore illegale, la funzione membro che ne permette il cambiamento, lo comprende e ne vieta l'operazione. Infine il programma utilizza un valore legale per impostare il livello di fame. Il codice è il seguente:
// Roditore privato
//Dimostrazione dei livelli di accesso
#include <iostream>
using namespace std;
class Roditore
{ public:
Roditore( int fame =0 );
int DaiFame() const;
void MettiFame( int fame);
void Saluto();
private: //sezione privata
int i_Fame;
};
Roditore::Roditore( int fame ): i_Fame (fame)
{ cout << “E' nato un nuovo roditore!” << endl;
}
int Roditore::DaiFame() const
{ return i_Fame;
}
void Roditore::MettiFame( int fame)
{ if (fame < 0 ) cout << “Non ci puo' essere un valore negativo della fame.” << endl;
else i_Fame = fame;
}
void Roditore::Saluto() //definizione funzione membro
{ cout << “Ciao, io sono un roditore. Questo è il mio livello di fame ” << i_Fame << “.\n”;
}
int main()
{
Roditore topo(5);
// cout << topo.i_Fame; // illegale i_Fame è privato
cout << “Chiama DaiFame():” << topo.DaiFame() << endl;
cout << “Chiamare MettiFame() con -5” << topo.MettiFame( -5 );
topo.MettiFame(15);
topo.Saluto();
return 0;
}

 

Specificare i livelli di accesso Pubblico e Privato

Ogni classe di funzioni e dati possiede un livello di accesso, il quale determina da dove il programma ha accesso ad essi. Così, viene sempre specificato quali hanno accesso pubblico usando la parola chiave public. In Roditore, la sezione pubblica viene introdotta con la linea:
public:
Roditore( int fame =0 ); 
 
Utilizzando questa parola chiave, sottolineo che ogni membro o funzione che segue sino ad una diversa specifica di livello deve essere ritenuta pubblica. Questo significa che ogni parte del programma ha accesso ad essi. Per cui il codice del programma può richiamare queste funzioni della classe Roditore.
Dopodiché viene definita la sezione privata con la seguente linea di codice:
private: //sezione privata
int i_Fame;

Usando private, ogni membro dati o funzione che segue (sino a diversa specifica) deve essere privata. Questo vuol dire che solo il codice nella classe Roditore ha accesso diretto ad esse. Poiché i_Fame viene dichiarato in questa sezione, solo il codice presente in Roditore può accedere direttamente al membro dati i_Fame dell'oggetto. Per cui tentare di accedere ad esso attraverso la funzione main(), crea un'operazione illegale la quale genera un errore nel programma.
// cout << topo.i_Fame; // illegale i_Fame è privato

E' possibile generare sezioni private in una classe seguite da sezioni pubbliche ripetendo l'accesso ai modificatori. Infine ogni classe membro dichiarata è privata per default, a meno di modifiche al livello di accesso specifiche.

Nessun commento:

Posta un commento