2011-12-02 6 views
12

Tak z ciekawości: czy mam zagnieżdżone zakresy, jak w tym próbki kodu C++Czy istnieje sposób dostępu do zmiennej lokalnej w zewnętrznym zakresie w C++?

using namespace std; 

int v = 1; // global 

int main (void) 
{ 
    int v = 2; // local 
    { 
     int v = 3; // within subscope 
     cout << "subscope: " << v << endl; 
     // cout << "local: " << v << endl; 
     cout << "global: " << ::v << endl; 
    } 
    cout << "local: " << v << endl; 

    cout << "global: " << ::v << endl; 

} 

Czy istnieje jakiś sposób, aby uzyskać dostęp do zmiennej v o wartości 2 z „pośrednim” zakres (ani globalne ani lokalny)?

+11

Nie będzie to jednak ważne w języku C#. –

+3

Powiedziałbym, że jest to raczej zła praktyka na początku, używanie tej samej nazwy zmiennej w każdym nowym zakresie nie wydaje się dobrym pomysłem z jakiegokolwiek powodu. –

+0

nie. jeśli potrzebujesz dostępu, zmień nazwy zmiennych. – Dani

Odpowiedz

14

Można zadeklarować nową adnotacje jako alias jak tak

int main (void) 
{ 
    int v = 2; // local 
    int &vlocal = v; 
    { 
     int v = 3; // within subscope 
     cout << "local: " << vlocal << endl; 
    } 
} 

Ale chciałbym uniknąć tej praktyki to całkowicie. Spędziłem wiele godzin na debugowaniu takiej konstrukcji, ponieważ zmienna została wyświetlona w debugerze jako zmieniona ze względu na zasięg i nie mogłem ustalić, jak to się zmieniło.

+0

i zamiast tego, po prostu przemianować 'v' na' vlocal' będzie? – Nim

+6

@Nim Jeśli OP był zaniepokojony zmianą kodu spuścizny spaghetti z minimalną zmianą –

7

Odpowiedź brzmi Nie Nie można.
Zmienna w zasięgu lokalnym cienia zmienną w zakresie globalnym, a język zapewnia sposób dostępu do zmiennej globalnej przy użyciu kwalifikowanych nazw globalnych, tak jak Ty. Ale C++ jako język i tak nie zapewnia dostępu do pośredniej zmiennej o ustalonym zakresie.

Biorąc pod uwagę, że byłoby to dozwolone, wymagałoby to wielu skomplikowanych operacji, Wyobraź sobie sytuację z liczbą zakresów (może być bardzo nieskończona) i obsługą tych.

Lepiej przemianuj swoje zmienne pośrednie i korzystaj z tych, które byłyby bardziej logiczne i łatwe w utrzymaniu.

+0

Jaki jest przykład, gdy liczba zakresów jest nieskończona? A może chciałeś powiedzieć bardzo dużą liczbę zakresów? – Garrett

1

mogli Państwo udawać tak:

#include <iostream> 
using namespace std; 
int v = 1; 

int main() 
{ 
     int v = 2; 
     { 
       int &rv = v; // create a reference 
       int v = 3; // then shadow it 

       cout << "subscope: " << v << endl; 
       cout << "local: " << rv << endl; 
       cout << "global: " << ::v << endl; 
     } 
     cout << "local: " << v << endl; 

     cout << "global: " << ::v << endl; 

     return 0; 
} 

Co ciekawe ten kompiluje na cygwin g ++ ale zwraca błąd, jeśli spróbujesz go uruchomić:

#include <iostream> 
using namespace std; 
int v = 1; 

int main() 
{ 
     int v = 2; 
     { 
       int &v = v; 
       cout << "subscope: " << v << endl; 
       // cout << "local: " << v << endl; 
       cout << "global: " << ::v << endl; 
     } 
     cout << "local: " << v << endl; 

     cout << "global: " << ::v << endl; 

     return 0; 
} 
4

Istnieją dwa rodzaje scope resolution operatorów w C++ - jednolity zakres i zakres klasy. Nie ma zasięgu funkcji ani operatorów rozdzielczości "żaden konkretny nadrzędny zasięg". To sprawia, że ​​niemożliwe jest rozwiązanie twojego problemu, ponieważ tak jest, ponieważ nie możesz odwoływać się do anonimowych zakresów. Można jednak utworzyć alias, zmienić zmienne lub uczynić go częścią klasy, co oczywiście oznacza zmianę kodu. Jest to najbliżej można dostać się bez zmiany nazwy, w tym konkretnym przypadku:

#include <iostream> 

using namespace std; 

int v = 1; // global 

class Program 
{ 
    static int v; // local 

public: 
    static int main() 
    { 
     int v = 3; // within subscope 
     cout << "subscope: " << v << endl; 
     cout << "local: " << Program::v << endl; 
     cout << "global: " << ::v << endl; 
    } 
}; 

int Program::v = 2; 

int main() 
{ 
    return Program::main(); 
} 

Istnieją inne sposoby, takie jak upewniając się, że zmienne nie są zoptymalizowane na zewnątrz i są na stosie, a następnie można pracować z komina bezpośrednio zdobyć wartość zmiennej, którą chcesz, ale nie idźmy tą drogą.

Mam nadzieję, że pomoże!

Powiązane problemy