C++   ::   Хилл Мюррей

Страница: 246 из 357

Буква "o" в названиях стоит для того, чтобы напоминать вам, что объект может находиться одновременно только в одном списке olist:

struct olink (* olink* next;

*);

Класс olist очень напоминает класс slist. Отличие состит в том, что пользователь класса olist манипулирует объектми класса olink непосредственно:

class olist (* olink* last; public: void insert(olink* p); void append(olink* p); olink* get(); // ... *);

Мы можем вывести из класса olink класс name:

class name : public olink (* // ... *);

Теперь легко сделать список, который можно использовать без накладных расходов времени на размещение или памяти.

Объекты, помещаемые в olist, теряют свой тип. Это ознчает, что компилятор знает только то, что они olink'и. Првильный тип можно восстановить с помощью явного преобразовния типа объектов, вынутых из olist. Например:

void f() (* olist ll; name nn; ll.insert( amp;nn); // тип amp;nn потерян name* pn = (name*)ll.get(); // и восстановлен *)

Другой способ: тип можно восстановить, выводя еще один класс из olist для обработки преобразования типа:

class onlist : public olist (* // ... name* get() (* return (name*)olist::get(); *) *);

Имя name может одновременно находиться только в одном olist. Для имен это, может быть, и не подходит, но в классах, для которых это подойдет полностью, недостатка нет. Например, класс фигур shape использует для поддержки списка всех фигур именно этот метод. Обратите внимание, что можно было бы опрделить slist как производный от olist, объединяя таким обрзом оба понятия. Однако использование базовых и производных классов на таком микроскопическом уровне может очень сильно исказить код.



7.5 Неоднородные Списки

Предыдущие списки были однородными.

|< Пред. 244 245 246 247 248 След. >|

Java книги

Контакты: [email protected]