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



         

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


void List::ListItem::check_status()

{

   int value = ::list;  // правильно

}

Если бы функция-член check_status() была определена как встроенная в теле класса ListItem, то последнее объявление привело бы к выдаче сообщения об ошибке из-за того, что имя list не объявлено в глобальной области видимости:

class List {

public:

   // ...

private:

   class ListItem {

   public:

      // ошибка: нет видимого объявления для ::list

      void check_status() { int value = ::lis; }

      //...

   };

   ListItem *list;

   // ...

};

int list = 0;

Глобальный объект list объявлен после определения класса List. Во встроенной функции-члене, определенной внутри тела класса, рассматриваются только те глобальные объявления, которые были видны перед определением объемлющего класса. Если же определение check_status() следует за определением List, то рассматриваются глобальные объявления, расположенные перед ним, поэтому будет найдено глобальное определение объекта list.

Упражнение 13.21

В главе 11 был приведен пример программы, использующей класс iStack. Измените его, объявив классы исключений pushOnFull и popOnEmpty открытыми вложенными в iStack. Модифицируйте соответствующим образом определение класса iStack и его функций-членов, а также определение main().




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