С++ для начинающих




.Разрешение имен в области видимости вложенного класса


Посмотрим, как разрешаются имена в определениях вложенного класса и его членов.

Имя, встречающееся в определении вложенного класса (кроме тех, которые употребляются во встроенных функциях-членах и аргументах по умолчанию) разрешается следующим образом:

1.      Просматриваются члены вложенного класса, расположенные перед употреблением имени.

2.      Если шаг 1 не привел к успеху, то просматриваются объявления членов объемлющего класса, расположенные перед употреблением имени.

3.      Если и этого недостаточно, то просматриваются объявления, расположенные в области видимости пространства имен перед определением вложенного класса.

Например:

enum ListStatus { Good, Empty, Corrupted };

class List {

public:

   // ...

private:

   class ListItem {

   public:

      // Смотрим в:

      // 1) List::ListItem

      // 2) List

      // 3) глобальной области видимости

      ListStatus status;   // относится к глобальному перечислению

      // ...

   };

   // ...

};

Сначала компилятор ищет объявление ListStatus в области видимости класса ListItem. Поскольку его там нет, поиск продолжается в области видимости List, а затем в глобальной. При этом во всех трех областях просматриваются только объявления, предшествующие использованию ListStatus. В конце концов находится глобальное объявление перечисления ListStatus – оно и будет типом, использованным в объявлении status.

Если вложенный класс ListItem определен в глобальной области видимости, вне тела объемлющего класса List, то все члены List уже были объявлены:

class List {

private:

   class ListItem {

   //...

public:

   enum ListStatus { Good, Empty, Corrupted };

   // ...

};

class List::ListItem {

public:

   // Смотрим в:

   // 1) List::ListItem

   // 2) List

   // 3) глобальной области видимости

   ListStatus status;   // относится к глобальному перечислению

   // ...

};

При разрешении имени ListStatus сначала просматривается область видимости класса ListItem. Поскольку там его нет, поиск продолжается в области видимости List. Так как полное определение класса List уже встречалось, просматриваются все члены этого класса. Вложенное перечисление ListStatus найдено несмотря даже на то, что оно объявлено после объявления ListItem. Таким образом, status объявляется как указатель на данное перечисление в классе List. Если бы в List не было члена с таким именем, поиск был бы продолжен в глобальной области видимости среди тех объявлений, которые предшествуют определению класса ListItem.




Содержание  Назад  Вперед