| prof. Nunzio Brugaletta |
C++:
programmazione e oggetti |
L'applicazione del paradigma funzionale porta a costruire delle librerie contenenti funzioni che si occupano delle elaborazioni riguardanti famiglie di problemi. Le librerie espandono le potenzialità del linguaggio: agli strumenti resi disponibili dal linguaggio standard, si possono aggiungere tutte le funzionalità che servono per agevolare la risoluzione di un determinato problema. Basta includere, nel programma la libreria che si intende utilizzare.
A parte una visione più dettagliata di quanto detto, che verrà fornita nei prossimi paragrafi, è un procedimento che si è adottato fin dalla scrittura del primo programma, quando si è dichiarata la volontà di utilizzare le funzioni, per esempio, della iostream.
L'utilizzo di più librerie può portare ad ambiguità se, per esempio, esistono nomi uguali in più librerie. C++, per risolvere problemi di questo genere, rende disponibili i namespace, che delimitano la visibilità dei nomi in essi dichiarati.
#include <iostream>
using namespace std; /*1*/
namespace prova1{ /*2*/
int a=5;
};
namespace prova2{ /*3*/
int a=10;
int b=8;
};
int main()
{
cout << prova1::a << endl; /*4*/
cout << prova2::a << endl; /*5*/
cout << prova2::b << endl; /*6*/
return 0;
}
La dichiarazione di 1 rende accessibili tutti i nomi del namespace std. Le librerie disponibili nel C++ (iostream, string, vector, ecc...) hanno i nomi (cin, cout, ecc...) inclusi in questo namespace.
Nella 2 viene dichiarato prova1 che contiene al suo interno una variabile a che assume un valore diverso da quello assunto da una variabile, con lo stesso nome, dichiarata nel namespace prova2 (3).
Nella 4 si richiede la stampa della variabile a definita nel namespace prova1. L'operatore ::, operatore di visibilità, consente di specificare in quale namespace deve essere cercata la variabile a. Senza questo operatore, il compilatore genererebbe un errore: non è infatti definita, nel main, alcuna variabile a.
Il valore stampato in conseguenza della esecuzione della 5 è diverso dal precedente, poiché qui ci si riferisce alla variabile a definita nel namespace prova2.
Si poteva aggiungere una riga del tipo:
using namespace prova1;
e, in questo caso, non era necessario utilizzare l'operatore di visibilità nella 4.
#include <iostream>
using namespace std;
namespace prova1{
int a=5;
};
namespace prova2{
int a=10;
int b=8;
};
using namespace prova1; /*1*/
using namespace prova2; /*1*/
int main()
{
cout << prova1::a << endl; /*2*/
cout << prova2::a << endl; /*2*/
cout << b << endl; /*3*/
return 0;
}
Si può fare in modo, come nelle 1, di rendere accessibili i nomi dei due namespace, e, quindi, avere la possibilità di accedere a quanto contenuto senza necessità di specificare l'operatore di visibilità ::, ma, in questo caso, tale possibilità può essere sfruttata solo nel caso della 3. Negli altri due casi di uso (2) è necessario specificare il namespace perché il riferimento è ambiguo. Tale sarebbe anche la natura dell'errore evidenziato dal compilatore, se non si usasse l'operatore di visibilità: la variabile è definita in tutte e due i namespace e il compilatore non può decidere a quale riferirsi.
Se lo stesso namespace è definito più volte ogni nuova definizione espande quella precedente: è come se tutte le variabili fossero fisicamente all'interno dello stesso namespace.
| http://ennebi.solira.org |
ennebi@solira.org |