Kezdőoldal » Számítástechnika » Programozás » C++-ban névtereket csak...

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?

Figyelt kérdés

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;

}



2017. jún. 30. 19:53
 1/7 anonim ***** válasza:
Ez mi akar lenni?
2017. jún. 30. 20:11
Hasznos számodra ez a válasz?
 2/7 anonim ***** válasza:

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

2017. júl. 1. 00:17
Hasznos számodra ez a válasz?
 3/7 anonim ***** válasza:
Nem tudom mit szeretnél. Egyébiránt ami írtál egy működő kód, leszámítva, hogy a cout meg endl elé kéne a névtér. Anoním névtereket egyébiránt széleskörűen használnak. Már ha erre irányult a kérdésed, mert őszintén szólva, nem igazán sikerült megértenem, mit is szeretnél.
2017. júl. 1. 00:18
Hasznos számodra ez a válasz?
 4/7 A kérdező kommentje:
A példának tényleg nem sok köze van a kérdésemhez, bocs. A kérdés csupán annyi, hogy csak globális változókat helyezhetünk el névterekben, vagy lokális változókat is? Pl. a main függvényen belül vagy bármilyen más függvényen belül létrehozhatok-e még egy névteret is vagy nem?
2017. júl. 1. 09:51
 5/7 anonim ***** válasza:

Függvényen belül nem hozhatsz létre névteret.

Nem is tudom elképzelni miért is kellene.

2017. júl. 1. 10:07
Hasznos számodra ez a válasz?
 6/7 anonim ***** válasza:

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)

2017. júl. 1. 11:49
Hasznos számodra ez a válasz?
 7/7 anonim ***** válasza:
Áh, azt hiszem értem már. NEm, függvényen belül nem tudsz névteret létrehozni, sem új névtér elemeket megadni. Kérdés, hogy pontosan mit is akarsz elérni ezzel, de szerintem amit te szeretnél, az a függvényen belül létrehozott static változó.
2017. júl. 1. 12:14
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!