C++-ban névtereket csak globális változók számára definiálhatunk? Pl. Függvényeken belül nem lehet névtereken belül elhelyezni a változókat?
Példa:
#include <iostream>
namespace std {
int a = 0;
}
namespace {
int b = 0;
}
int main() {
int a = 3;
int b = 3;
cout << std::a << " " << ::b << endl;
return 0;
}
namespace A
{
... int a ;
... namespace B
... {
... ... int a ;
... ... short C(short k);
... }
}
namespace A
{
... int a ; // hiba: azonosító ütközés
... int b ;
... long C(int k) ;
}
A névtérbeli programobjektumokra történő hivatkozás: A::B::a.
A hivatkozásnak teljesnek kell lennie, a névtér hierarchia minden
azonosítójának kell benne szerepelni. Az azonosítókat a scope-resolution
(scope feloldó) operátor (a ::) választja el egymástól. A global scope szintén
egy névtér, amit jelezhetünk így ::Sum(23, 23) ; (az azonosítók elé tett
:: jellel).
Keresési útvonal megadása: a using utasítással. Egymás után több using
utasítást is írhatunk. A nem egyértelmű hivatkozások elkerülése a teljes
útvonal megadásával mindenképpen javasolt.
namespace D
{
... int d1;
... void f(int);
... void f(char);
}
using namespace D;
int d1; // nincs ütközés a D::d1 -gyel
namespace E
{
... int e;
... void f(int);
}
namespace D // namespace folytatása
{
... int d2;
... using namespace E; // <-- using !!!
... void f(int);
}
void f()
{
... d1++; // hiba, melyik ::d1 or D::d1?
... ::d1++; // ok
... D::d1++; // ok
... d2++; // ok: D::d2
... e++; // ok: E::e
... f(1); //melyik D::f(int) or E::f(int) ?
... f('a'); // ok D::f(char)
}
Forrás: Dr. Alexin Zoltán előadás jegyzet
Függvényen belül nem hozhatsz létre névteret.
Nem is tudom elképzelni miért is kellene.
Nah akkor:
Névtérbe 4 dolog tehető bele (hmm.. jól tudom?):
- Másik névtér
- Függvény
- Változó
- Osztály
Lokális változó az ami a függvényen belül inicializálsz, tehát az el fog veszni a függvényből való kilépéssel. (lásd verem) Avagy pointert készítesz, és gondoskodsz a törléséről. Ez ugyebár megmarad, de kell tárolni valahol kívül is, hogy megtartsd. -> tehát változó kívül lesz, azaz nem lokálisan
Vagy (statikus) osztályokat csinálsz, és "csoportosítod". De a példányosításokkal ugyanott tartunk, hogy stack vagy heap módon oldod meg.
(stack - pl. int i; fgv kilépésekor törlődik)
(heap - lásd pointer, ami nem kötődik a hívási veremhez)
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!