[C++] Cum accesez indentificatori dintr-un namespace?

Despre limbajul de programare C++ si biblioteca standard STL (forum moderat)
Post Reply
User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

[C++] Cum accesez indentificatori dintr-un namespace?

Post by Marius Bancila » 30 Jul 2007, 11:58

Intrebare: Ce de codul de mai jos genereaza o eroare de compilator?

Code: Select all

 
#include <iostream>

int main()
{
   cout << "salut de pe a treia planeta de la soare" << endl;
   return 0;
}
Raspuns: Sinpla includere a acelui header (precum si a altora) nu este suficienta. Atunci cand un identificator (clasa, structura, enum, constanta, etc.) e declarat intr-un namespace, acesta trebuie accesat folosind numele namespace-ului (cu alte cuvinte calificatorul complet), sau incarcand namespace-ul respectiv in cel curent. Intreaga biblioteca standard C++ este definita in namespace-ul 'std'. Aceasta inseamna ca calificatorul complet pentru cout este std::cout. Astfel incat codul anterior trebuie scris asa:

Code: Select all

 
#include <iostream>

int main()
{
   std::cout << "salut de pe a treia planeta de la soare" << std::endl;
   return 0;
}

Intrebare: Exista o modalitate de a evita folosirea calificatorului complet?

Raspuns: Se poate prin incarcarea unor indentificatori dintr-un namespace, sau a unui intreg namespace, in namespace-ul curent (adesea cel global).

Declaratia using incarca un nume dintr-un namespace in namespace-ul curent. Respectivul nume devine un alias pentru unul declarat altundeva.

Code: Select all

 
#include <iostream>

using std::cout;
using std::endl;

int main()
{
   std::cout << "salut de pe a treia planeta de la soare" << endl;
   return 0;
}
Directiva using incarca un intreg namespace in namespace-ul curent, permitand folosirea tuturor idenficatorilor din acesta fara calificatorul complet.

Code: Select all

 
#include <iostream>

using namespace std;

int main()
{
   std::cout << "salut de pe a treia planeta de la soare" << endl;
   return 0;
}
Nu este recomandata folosirea directivei 'using namespace' in fisierele header, pentru ca va incarca intregul namespace in orice fisier cpp in care este inclus, ceea ce s-ar putea sa afecteze timpul de compilare.

Exista si o a treia optiune, si anume aliasurile de namespaces-uri:

Code: Select all

namespace A
{
  namespace B
  {
      class foo {};
  }
}

namespace C = A::B;  // C este un alias pentru A::B

C::foo f;

Next FAQ >>


Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

Post Reply