Przestrzenie nazw
Witam ponownie. Dzisiaj powiemy sobie o przestrzeniach nazw. Przestrzenie nazw to pewien mechanizm, narzędzie lub po prostu standard Języka C/C++, które czasami może ułatwić nam życie. Powiedzmy, że razem ze znajomymi piszesz program. Rodzaj aplikacji pomijamy, bo jest w tej chwili bez znaczenia. Po dokładnym zaplanowaniu projektu rozdzielacie go na kilka części. Każdy dostaje odrębny moduł programu do napisania. Po napisaniu kompilujecie całość i składacie do kupy. Nagle okazuje się, że w niektórych plikach występują takie same nazwy zmiennych globalnych lub funkcji globalnych. Pojawia się dwuznaczność i kompilator [a raczej linker] wywali błąd. Co wtedy? Pamiętasz zapewne jak kiedyś wspomniałem o słówku kluczowym static? W takich przypadkach było ono bardzo przydatne i ratowało z opresji. Dla pewności może przypomnę jego działanie. Słowo static pozwalało na stosowanie takich samych nazw w różnych plikach projektu. Dzięki temu kompilator 'rozumiał' że dana zmienna, czy funkcja jest znana tylko w obrębie pliku, w którym się pojawiła. Teraz takie rozwiązanie zaczyna powoli ustępować miejsca przestrzeniom nazw. Zobacz teraz, w jaki sposób definiuje się przestrzeń nazw:
namespace mojaPrzestrzen
{
int mojaZmienna = 128;
void mojaFunkcja ()
{
cout << "moja przestrzen";
}
}
Widzisz jakie to proste! :) Zauważ podobieństwo do definicji klasy. No dobra, mamy już zdefiniowaną przestrzeń. Dostęp do elementów przestrzeni odbywa się na dwa sposoby. Po pierwsze możemy potraktować przestrzeń, jak klasę ze wszystkimi statycznymi składnikami. Zatem odwołanie się do zmiennej mojaZmienna z przestrzeni nazw mojaPrzestrzen wygląda tak:
mojaPrzestrzen::mojaZmienna = 128;
Prawda, że proste! To samo tyczy się funkcji zdefiniowanych z przestrzeni. W naszym przypadku wywołanie funkcji mojaFunkcja wygląda następująco:
mojaPrzestrzen::mojaFunkcja ();
Myślę, że wszystko jest jasne i zrozumiałe. Wiemy już, jak odnosić się do składników przestrzeni nazw. Jest to proste i wygodne. Ale, ale.. może być jeszcze prostsze! :) Jeżeli w programie mamy tylko jedną przestrzeń bądź z jednej korzystamy bardzo często możemy jeszcze bardziej uprościć sobie życie. Popatrze:
namespace mojaPrzestrzen
{
int mojaZmienna = 128;
void mojaFunkcja ()
{
cout << "moja przestrzen";
}
}
using namespace mojaPrzestrzen; //określenie domyślnej przestrzenii
Od teraz nie musimy już za każdym razem pisać mojaPrzestrzen::mojaZmienna. Teraz wystarczy napisać mojaZmienna i kompilator będzie wiedział, o którą zmienną chodzi. Zatem słowa using namespace służą do określenia domyślnej przestrzenii nazw.