2010-10-14 11 views
5
void foobar(){ 
    int local; 
    static int value; 
    class access{ 
      void foo(){ 
       local = 5; /* <-- Error here */ 
       value = 10; 
      } 
    }bar;  
} 
void main(){ 
    foobar(); 
} 

Warum nicht Zugriff auf local innerhalb foo() kompilieren? OTOH Ich kann leicht auf die statische Variable value zugreifen und sie ändern.Zugriffsproblem in lokaler Klasse

+4

Der Rückgabetyp von 'main()' muss immer 'int' sein. –

Antwort

1

Innerhalb einer lokalen Klasse können Sie keine automatischen Variablen aus dem umschließenden Bereich verwenden/darauf zugreifen. Sie können nur statische Variablen, externe Variablen, Typen, Aufzählungen und Funktionen aus dem umschließenden Bereich verwenden.

0

Make local statisch und dann sollten Sie in der Lage sein, darauf zuzugreifen

1

Von Standard docs Sec 9.8.1,

Eine Klasse kann innerhalb einer Funktionsdefinition deklariert werden; Eine solche Klasse wird als lokale Klasse bezeichnet. Der Name einer lokalen Klasse ist lokal zu seinem umschließenden Bereich. Die lokale Klasse ist im Geltungsbereich des umschließenden Bereichs und hat den gleichen Zugriff auf Namen außerhalb der Funktion wie die umschließende Funktion. Deklarationen in einer lokalen Klasse können nur Typnamen, statische Variablen, externe Variablen und Funktionen und Enumeratoren aus dem umschließenden Bereich verwenden.

Ein Beispiel aus dem Standard-Dokumente selbst,

int x; 
void f() 
{ 
static int s ; 
int x; 
extern int g(); 
struct local { 
int g() { return x; } // error: x is auto 
int h() { return s; } // OK 
int k() { return ::x; } // OK 
int l() { return g(); } // OK 
}; 
// ... 
} 

somit eine automatische Variable innerhalb einer lokalen Klassen-Zugriff nicht möglich ist. Machen Sie entweder Ihren lokalen Wert als static oder einen globalen Wert, der für Ihr Design passend aussieht.

0

Wahrscheinlich, weil Sie ein Objekt deklarieren können, das außerhalb des Gültigkeitsbereichs der Funktion liegt.

foobar() called // local variable created; 
Access* a = new Access(); // save to external variable through interface 
foobar() finished // local variable destroyed 

... 


savedA->foo(); // what local variable should it modify?