|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
[C++] la libreria standard e i namespaces
Salve,
mi chiedo: Se all'interno del mio programma faccio uso di cout, cin e anche ifstrem anziché includere #include <iostream> #include <fstream> non posso semplicemente includere il namespace std visto che le classi di entrambi sono specificate in std ? Se faccio così è ok : #include <iostream> #include <fstream> using namespace std; ma se faccio così mi dice che non ricnonsce fstream. Ma non dovrebbe trovarlo in std ? : #include <iostream> using namespace std; |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Aug 2000
Messaggi: 608
|
Allora io mi allaccio alla domanda di Leon84 e ne pongo una molto simile e collegata:
per quale motivo, includendo solamente <iostream> (con relativo "using namespace std", ovviamente) riesco ad utilizzare anche la funzione system() che invece, da specifiche, dovrebbe trovarsi in <cstdlib> ? ![]() Ho provato, giuro che funziona e NON ho incluso <cstdlib>, ma soltanto <iostream>. Come è possibile?
__________________
Intel Core2Quad Q6600 2,4GHz @ 3,0 GHz 2 Gb RAM 667 MHz ATI HD2900XT |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
è vero.. anche a me con il borland a scuola(che se metto l'using namespace std mi da errore) devo aggiungere stdlib.h e io.h mentre a casa con visual c++ express non me le ha mai richieste.. ma non saprei dire il perchè.. aspetteremo notizie da cionci ed andbin
![]() |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
Beh allora non capisco una cosa :
includendo solo <iostrem> e all'occorrenza <fstream> quando mi serve non capisco l'utilità a questo punto di avere il namespace std ... Mi spiegate ? |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
I namespace servono per poter distinguere oggetti/funzioni con lo stesso nome forniti la librerie diverse.
Immagino che nessuno si metta a scrivere una classe chiama ofstream ![]() Ammetto che per la libreria standard il problema e' relativo; in quanto standard, e quindi sempre presente, nella maggior parte dei casi si cerchera' di evitare omonimie con quanto fornisce, ma direi che una riga in piu' val bene il rischio. Nel caso di librerie di terze parti invece la cosa e' comodissima, perche' permette di evitare collisioni imprevedibili con altre librerie, senza dover anteporre un prefisso a tutto come succede in C.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
mmm... mi è poco chiaro ... scusa la mia ignoranza ...
allora : mettiamo che nel mio programma faccio uso di iostream e fstream. immagino che nella iostream ci sia qualcosa di questo tipo : namespace std { class X class Y class Z } nel momento in cui includo anche fstream scommetto che ci sarà anche li namespace std { class T class F class G } ciò significa che il namespace precedente che includeva le prime 3 classi è stato esteso con le ulteriori classi di fstream. Ora nel mio programma uso il namespace std Questo significa che se faccio riferimento a nomi del tipo X T Z T F G sto utilizzando quelli del namespace std. Dico bene ? Allora la mia domanda è la stessa : a cosa mi serve usare il namespace se le librerie che uso sono quelle standard ??? Risposta : a nulla. Ora tu mi dici : il vantaggio si ha se uso classi con lo stesso nome appartenenti però a namespace differenti ... cioè : mettiamo che la mia classe X sia presente anche in un file chiamato "pippo.h" nel seguente modo : namespace std2 { class X } se nel mio programma scrivo : using namespace std using namespace std2 in questo modo cmq l'ambiguità non viene risolta giusta ???? Cioè per differenziarli dovrei cmq utilizzare il risolutore di visibilità "::" e cioè std::X std2::X Allora ancora una volta non capisco davvero l'utilità di questo namespace ... mah ... |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Mentre userai std2::X per X... Ti faccio un esempio: ho un programmone immenso...devo estenderlo utilizzando un nuova versione di una libreria...soltanto che non posso rinunciare ad alcune classi/funzioni della libreria vecchia che non sono implementate nella nuova, mentre alcune altre classi/funzioni collidono. Quindi metto la libreria nuova in un namespace diverso da quello della libreria vecchia ed uso il risolutore di visibilità per accedere alle nuove classi/funzioni che mi servono senza modificare una virgola del programma vecchio. Altro esempio: scrivo un sistema operativo e quindi ho implementato nuovamente tutte le funzioni base di input e output della libreria standard. Fin quando faccio il testing sul sistema operativo ospite continuo ad usare la libreria standard con il namespace std. Quando vado a compilare il mio sistema operativo uso il namespace, mettiamo, std2 al posto di std. In modo da linkare al programma la libreria standard per il nuovo sistema operativo invece di quella per il sistema operativo ospite. |
|
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Quote:
lo so che è vecchissimo ma che vuoi farci quello c'è.. e non credere che non abbiamo provato a chiedere di mettere almeno il dev-cpp.. ![]() |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:21.