Проблема с доступом в местном классе - PullRequest
5 голосов
/ 14 октября 2010
void foobar(){
    int local;
    static int value;
     class access{
           void foo(){
                local = 5; /* <-- Error here */
                value = 10;
           }
     }bar;    
}   
void main(){
  foobar();
}

Почему нет доступа к local внутри foo() компиляции?OTOH Я могу легко получить доступ и изменить статическую переменную value.

Ответы [ 4 ]

1 голос
/ 14 октября 2010

Из стандартных документов Сек. 9.8.1 ,

Класс может быть объявлен в определении функции; такой класс называется локальным классом. Название локального класса является локальным в его объем. Локальный класс находится в области видимости, и имеет такой же доступ к именам за пределами функция, как и вмещающая функция. Объявления в локальном классе могут использовать только имена типов, статические переменные, внешние переменные и функции, а также перечислители из прилагаемой области видимости.

Пример из самого стандартного документа,

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

Следовательно, доступ к автоматической переменной внутри локального класса невозможен. Либо сделайте локальное значение static, либо глобальным, в зависимости от того, подходит для вашего дизайна.

1 голос
/ 14 октября 2010

Внутри локального класса вы не можете использовать / получать доступ к автоматическим переменным из окружающей области. Вы можете использовать только статические переменные, внешние переменные, типы, перечисления и функции из окружающей области.

0 голосов
/ 14 октября 2010

Возможно, потому что вы можете объявить объект, который находится вне области действия функции.

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?
0 голосов
/ 14 октября 2010

Сделайте local статичным и тогда вы сможете получить к нему доступ

...