I. Diel C++ II. – Menné priestory – komplexné vysvetlenie

Michal Kyžňanský  /  15. 09. 2006, 00:00

Ako som vravel minule, vrátime sa aj k veciam o ktoré sme sa vo vysvetľovaní iba obtreli a nemusia byť celkom jasné. Mojím cieľom je ísť do hĺbky, aby si každý z môjho vysvetlenia urobil vlastnú predstavu a zistil, ako fungujú aj veci, ktoré doteraz boli iba „riadkom, ktorý tam proste musí byť“.

Začneme v tomto smere s mennými priestormi. Tento pojem je zrejme neznámy, ale použili sme ho už v niektorých príkladoch z prvej série tohto seriálu. Je to presne riadok, ktorý bol označený ako jeden z tých, ktoré tam musia byť, ale bližšie vysvetlenie nebolo podané. Ide o riadok using namespace std;

Názov menný priestor je odvodený od použitého slova namespace. Úlohou menný priestorov je zabrániť konfliktu medzi menami premenných, objektov, a iných inštancií v programe. Mohlo by sa zdať, že sa tomu dá vyhnúť aj bez použitia menných priestorov, ale ich použitie sa stalo veľmi obľúbeným. Môže nastať situácia, pri ktorej čerpáme zdroje z viacerých hlavičkových súborov, ktoré by mohli obsahovať rovnaké meno premennej a problém je na svete. Funkcia menného priestoru by sa dala vysvetliť ešte inak, a to tak, že je to vlastne deklarácia jednej alebo skupiny položiek, ktorá obsahuje okrem svojho mena ešte druhé meno, a pod patronátom tohto mena vystupuje v programe. Toto meno je zárukou nezameniteľnosti.

Takto sa dajú vytvoriť dva menné priestory.

namespace pc{
double znacka;
}
namespace mac{
char znacka;
}


Deklarácia menného priestoru si vyžaduje nasledovný syntax:

namespace názov_menneho_priestoru{
…… //premenné, funkcie a pod. ktoré chceme vložiť do
//menného priestoru
}

Ak už vieme vytvoriť menný priestor, ďalšou časťou práce s ním je prístup k nemu. Prístup k mennému priestoru je možné vykonávať rôzne. Slúži nám na to operátor ::, direktíva using a deklarácia using.

1. Prístup pomocou operátora ::


Tento prístup je najjednoduchší a udávame ním priamo s ktorým prvkom menného priestoru ideme narábať. Budeme pracovať s mennými priestormi, ktoré sme si deklarovali vyššie.
pocitac::znacka = 15;
mac::znacka = 'A';


Týmto spôsobom priamo pristupujeme k položkám menného priestoru a pracujeme s nimi.

2. Prístup pomocou deklarácie using

Táto metóda nám sprístupní vždy jeden prvok menného priestoru. Ukážeme si toto použitie v kombinácii s globálnou premennou procesor, a rovnomennou premennou z nami deklarovaného menného priestoru.
#include <cstdio> 
#include <iostream>
namespace pocitac{
double procesor;
}
namespace mac{
char procesor;
}

int procesor; //už tretia premenná s rovnakým menom

int main (void){
using pocitac::procesor; //sprístupnenie prvku pocitac::procesor
procesor = 15.47;

std::cout << procesor << ‘n’;
::procesor = 47; //takto vyzerá prístup ku
//globálnej premennej

std::cout << ::procesor;
getchar();
return 0;
}

3. Prístup pomocou direktívy using

Je dôležité si ujasniť pojem direktíva a deklarácia. Ide totiž o niečo úplne iné. Direktíva using sprístupní celý menný priestor. Pomocou tejto direktívy sa presunie do lokálneho menného priestoru, a tak všetky premenné, funkcie a všetko obsiahnuté v sprístupnenom mennom priestore môžeme používať, akoby to boli bežné premenné, teda nemusíme pred ne písať žiadne operátory.

using namespace pocitac;  //sprístupnenie menného priestoru pocitac 

procesor = 15; //prístup k položke pocitac::procesor
procesor = 'A'; //prístup k položke pocitac::procesor


Ak by sme kód použili nasledovne tak, v druhom priradení v nádeji, že priraďujeme položke mac::procesor by sme boli sklamaný, pretože priraďujeme položke procesor z menného priestoru pocitac. Takže výsledná hodnota premennej double pocitac by bola 65, pretože ASCI hodnota znaku ‘A’ je 65. Práve túto direktívu vo forme riadka using namespace std; používame v našich programoch. Tým označujeme menný priestor, v ktorom sú umiestnené objekty ako cin, cout a iné funkcie. Špičkový programátori ako aj celkovo sa neodporúča používať direktívu using namespace, pretože v rozsiahlejších projektoch je to nesmierne neprehľadné. Odporúča sa používať operátor :: alebo deklaráciu using, kvôli prehľadnosti.

Takže, ak by sme sa chceli držať týchto rád, tak by sme nepoužili riadok using namespace std; ale jednoducho pri použití objektov cin, cout alebo ktorejkoľvek inej funkcie umiestnenej v hlavičkovom súbore cstdio použili tvar std::cin/std::cout. Veľmi dôležité je si povedať, že menné priestory používame iba pri C++ ekvivalentoch hlavičkových súborov z jazyka C, alebo čisto C++ hlavičkových súboroch. Takto by vyzeral program, v ktorom by boli použité hore uvedené menné priestory pc a mac a riadili by sme sa radami profesionálov. Všimnite si hlavne jednotlivé prístupky k prvkom menných priestorov.

#include <iostream>     

namespace pocitac{
double procesor;
}
namespace mac{
char procesor;
}
int main (void){

pocitac::procesor = 15;
mac::procesor = 'A';

std::cout << pocitac::procesor << "n";
std::cout << mac::procesor;

getchar();
return 0;
}

V ďalšej časti nášho seriálu prejdeme na hierarchiu vstupno-výstupných tried a začneme objektom cout, jeho podrobným popisom.

Súvisiace články:

Prehľad všetkých dielov

Neprehliadnite: