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

¿Por qué no se puede acceder a local dentro de foo() compilar? OTOH Puedo acceder y modificar fácilmente la variable estática value.Problema de acceso en la clase local

+4

El tipo de retorno de 'main()' siempre debe ser 'int'. –

Respuesta

1

Dentro de una clase local no puede usar/acceder a variables automáticas desde el alcance adjunto. Puede usar solo variables estáticas, variables externas, tipos, enumeraciones y funciones del alcance adjunto.

0

Hacer local estática y, entonces debería ser capaz de acceder a él

1

a partir de documentos estándar Sec 9.8.1,

Una clase puede ser declarado dentro de una definición de función; tal clase se llama una clase local. El nombre de una clase local es local en su alcance adjunto. La clase local está en el alcance del alcance adjunto, y tiene el mismo acceso a los nombres fuera de la función que la función adjunta. Las declaraciones en una clase local solo pueden usar nombres de tipos, variables estáticas, variables externas y funciones, y enumeradores del alcance adjunto.

Un ejemplo de la propia docs estándar,

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 
}; 
// ... 
} 

acceso Por lo tanto una variable auto dentro de una clase local no es posible. Haga que su valor local sea static o uno global, cualquiera que sea apropiado para su diseño.

0

Probablemente porque puede declarar el objeto que está fuera del alcance de la función.

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? 
Cuestiones relacionadas