Внутренний доступ - PullRequest
       60

Внутренний доступ

4 голосов
/ 14 июля 2011

Может ли класс, написанный в методе другого класса (внутреннего класса), обращаться к переменным методов?Я имею в виду в приведенном ниже коде:

class A
{
  void methodA( int a )
  {
    class B
    {
      void processA()
      {
         a++;
      }
    };
     std::cout<<"Does this program compile?";
     std::cout<<"Does the value of the variable 'a' increments?";
  };

};

Законно ли это? Увеличивается ли значение 'a'?Подскажите пожалуйста.

Спасибо, Паван.

Ответы [ 2 ]

4 голосов
/ 14 июля 2011

Нет, это не законно
class B - это Локальный класс до methodA().

class B не может получить доступ к нестатическим «автоматическим» локальным переменным функции включения. Но он может получить доступ к статическим переменным из окружающей области.

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

Вот ссылка на стандарт C ++:

9.8 Локальные объявления классов [class.local]

  1. Класс может быть определен в определении функции; такой класс называется локальным классом. Имя локального класса является локальным по отношению к окружающей его области. Локальный класс находится в области действия охватывающей области и имеет такой же доступ к именам вне функции, что и функция включения. Объявления в локальном классе могут использовать только имена типов, статические переменные, внешние переменные и функции и перечислители из прилагаемой области видимости.
* 1 028 * [Пример: * +1029 *
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
   };
// ...
}
local* p = 0; // error: local not in scope

- конец примера]

2. Функция включения не имеет специального доступа к членам локального класса; он подчиняется обычным правилам доступа (пункт 11). Функции-члены локального класса должны быть определены в их определении класса, если они вообще определены.

3. Если класс X является локальным классом, вложенный класс Y может быть объявлен в классе X и позже определен в определении класса X или позднее определен в той же области, что и определение класса X. Класс, вложенный в локальный класс, является местный класс.

4. Локальный класс не должен иметь статических членов данных.

1 голос
/ 14 июля 2011

Краткий ответ, нет.Локальные классы в C ++ не имеют доступа к переменным их функции (с несколькими оговорками).Вы можете прочитать больше о локальных классах C ++ здесь , а также увидеть этот хороший ответ SO .Для акцента:

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

int x;                         // global variable
void f()                       // function definition
{
      static int y;            // static variable y can be used by
                               // local class
      int x;                   // auto variable x cannot be used by
                               // local class
      extern int g();          // extern function g can be used by
                               // local class

      class local              // local class
      {
            int g() { return x; }      // error, local variable x
                                       // cannot be used by g
            int h() { return y; }      // valid,static variable y
            int k() { return ::x; }    // valid, global x
            int l() { return g(); }    // valid, extern function g
      };
}

int main()
{
      local* z;                // error: the class local is not visible
// ...}
...