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




.Вложенные классы *


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

Имя вложенного класса известно в области видимости объемлющего класса, но ни в каких других областях. Это означает, что оно не конфликтует с таким же именем, объявленным в объемлющей области видимости. Например:

class Node { /* ... */ }

class Tree {

public:

   // Node инкапсулирован внутри области видимости класса Tree

   // В этой области Tree::Node скрывает ::Node

   class Node {...};

   // правильно: разрешается в пользу вложенного класса: Tree::Node

   Node *tree;

};

// Tree::Node невидима в глобальной области видимости

// Node разрешается в пользу глобального объявления Node

Node *pnode;

class List {

public:

   // Node инкапсулирован внутри области видимости класса List

   // В этой области List::Node скрывает ::Node

   class Node {...};

   // правильно: разрешается в пользу вложенного класса: List::Node

   Node *list;

};

Для вложенного класса допустимы такие же виды членов, как и для невложенного:

// Не идеально, будем улучшать

class List {

public:

   class ListItem {

      friend class List;       // объявление друга

      ListItem( int val=0 );   // конструктор

      ListItem *next;          // указатель на собственный класс

      int value;

   };

   // ...

private:

   ListItem *list;

   ListItem *at_end;

};

Закрытым называется член, который доступен только в определениях членов и друзей класса. У объемлющего класса нет права доступа к закрытым членам вложенного. Чтобы в определениях членов List можно было обращаться к закрытым членам ListItem, класс ListItem объявляет List как друга. Равно и вложенный класс не имеет никаких специальных прав доступа к закрытым членам объемлющего класса. Если бы нужно было разрешить ListItem доступ к закрытым членам класса List, то в объемлющем классе List следовало бы объявить вложенный класс как друга. В приведенном выше примере этого не сделано, поэтому ListItem не может обращаться к закрытым членам List.




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