Newsgroup: it.comp.lang.c++
Titolo: namespace

Ciao a tutti!
Scusate, ma non ho ben afferrato il concetto di NAMESPACE...
Da quello che ho capito si usano per distinguere le funzioni delle varie 
librerie (ad esempio per la libreria iostream, si usa std::), in quanto 
due librerie potrebbero avere delle funzioni con lo stesso nome, ecc...
Ma quello che non capisco è:
1 - si usa il namespace std per tutte le librerie standard del C++? 
(iostream, conio...), oppure ogni libreria ha il suo?
2 - se volessi usare una libreria non standard (e per favore non ditemi 
che sono OT ;) ...), come faccio a capire che namespace devo usare? lo 
posso stabilire io?
Spero in una vostra risposta, intanto buon lavoro a tutti!

 Spero in una vostra risposta, intanto buon lavoro a tutti!
grazie!
-- 
Gerolamo
www.overweb.it


Il namespace indica lo spazio in cui sono visibili le variabili.
Ti porto un esempio:
void ciccio()
{
   int i;
   .
   .
}
la variabile i viene creata quando viene chiamata la funzione ciccio e viene
distrutta
quando esco dalla funzione. i appartiene al namespace di void ciccio().
Questo avviene per far si che il compilatore non si confonda con i nomi
delle variabili
(immagina quanti int i possono esserci all'interno di un programma.)
Questo avviene anche per le classi. Quando scrivi qualcosa del tipo std::
dici al
compilatore che deve accedere al namespace di std e cioč a tutte le funzioni
e variabili
che appartengono alla classe std.
Inoltre, iostream č una classe a se, ed č quindi dotata di un namespace
proprio.
Per (spero) chiarirti le idee, ti porto un altro esempio:
supponiamo di avere una classe bart con all'interno una funzione void
cazzimma()
ed una classe homer, derivata da bart, con all'interno la sua funzione void
cazzimma() ed
una funzione void applicaCazzimma() cosě implementata:
void homer::applicaCazzimma ()
{
      .
      .
      .
      if(devo applicare la mia cazzimma)
            cazzimma();
      else
            bart::cazzimma();
      .
      .
      .
}
Ecco cosa succede:
Se homer decide di applicare la propria cazzimma, allora chiama la funzione
cazzimma()
contenunta all'interno del proprio namespace.
Altrimenti, applica la cazzimma di bart, contenuta all'iterno del namespace
della classe bart.
Immagina i namespace come delle scatole. Nell'esempio abbiamo la scatola di
bart con dentro la scatola
di homer.
+-----------------------+
|   bart                |
|                       |
| +------------+        |
| |    homer   |        |
| |            |        |
| +------------+        |
|                       |
+-----------------------+
Quando ti trovi all'interno di una scatola, puoi vedere il contenuto della
scatola in cui ti
trovi ed il contenuto di tutte le scatole che stanno all'esterno.
Nell'esempio, dalla classe homer
posso vedere tutto ciň che contiene la classe bart ma NON viceversa.
Quando ti trovi all'interno di una scatola e vuoi accedere ad una scatola
esterna utilizzi
nomescatola::
se, invece, vuoi accedere alla scatola immediatamente superiore utilizzi
solo ::
In questo caso, scrivere bart::cazzimma() č uguale a scrivere ::cazzimma();
Spero di esserti stato d'aiuto.
Ciao.

Grazie mille!
Sei stato molto prezioso!


 Per (spero) chiarirti le idee, ti porto un altro esempio:
Forse dovresti chiarirtele tu per primo... Quello che chiami namespace
si chiama a norma di standard regione dichiarativa, e identifica la
porzione di programma nella quale un nome e' valido. Le regioni
dichiarative possono essere blocchi (anche il corpo di una funzione,
ovviamente), classi o namespace.
 
Ciao,
Nicola

 Nicola
Azzo, Nico hai ragionissimo.....l'ho scritto 50 volte e manco me ne sono
accorto!
Si vede che sto proprio fondendo......
Chiedo scusa a Rapperz....e a tutti i programmatori deboli di cuore che
leggeranno la grande minchiata che ho
scritto!
:'(
Grazie Nico per avermelo fatto notare....