Простейшая структура элемента последовательного контейнера очевидна: struct Elem
{ double item: // информационная часть
// связующая часть
Elem *next: // следующий элемент
Elem *prev: // предыдущий элемент
>:
Чтобы обеспечить инициализацию создаваемого элемента, добавим конструктор инициализации:
Elem(const double &а):item(a){}
Отметим, что программа-клиент, которая собирается использовать дек, ничего не должна знать о внутренней структуре узла. Чтобы это обеспечить, инкапсулируем узел в классе-контейнере и реализуем его в приватной части класса TDeque в качестве вложенного (см. п. 9.7 в [1]).
Вложенным называется класс, объявленный внутри другого класса. Он является членом объемлющего класса, а его определение может находиться в любой из секций ри|Я i с или pr i vat е. Уровень вложенности стандартом не ограничивается.
Вложенный класс по умолчанию не имеет доступа к приватным элементам объемлющего класса, так же как объемлющий класс — к приватным элементам вложенного. Чтобы это было возможно, нужно использовать механизм друзей, например:
class Outer { //...
friend class Inner: // для Inner доступна приватная часть Outer
class Inner // вложенный класс
{ friend class Outer: // для Outer доступна приватная часть Inner
//...
};
//. . .
}:
Ни вложенный, ни объемлющий классы не имеют возможности пользоваться методами друг друга непосредственно — как и для обычных невложенных классов необходимо объявить объект (или указатель), для которого вызвать нужный метод. Например, объект объемлющего класса может передаваться методу вложенного класса как параметр:
void Outer::Inner::Methodlnner(const Outer &t) { //...
memlnner = t.MethodOuter(); // вызов метода объемлющего класса //...
}
Здесь метод Methodlnner () вложенного класса получает ссылку на объект объемлющего класса и обычным способом вызывает метод MethodOuter () для инициализации своего поля memlnner. |