Создание новых производных от set_handle
class set_handle { set* rep; public: // ...
set* get_rep() { return rep; }
void bind(set* pp) { pp->handle_count++; if (--rep->handle_count == 0) delete rep; rep = pp; } };
Создание новых производных от set_handle классов обычно не имеет особого смысла, поскольку это - конкретный тип без виртуальных функций. Другое дело - построить управляющий класс для семейства классов, определяемых одним базовым. Полезным приемом будет создание производных от такого управляющего класса. Этот прием можно применять как для узловых классов, так и для абстрактных типов.
Естественно задавать управляющий класс как шаблон типа:
template<class T> class handle { T* rep; public: T* operator->() { return rep; } // ... };
Но при таком подходе требуется взаимодействие между управляющим и "управляемым" классами. Если управляющий и управляемые классы разрабатываются совместно, например, в процессе создания библиотеки, то это может быть допустимо. Однако, существуют и другие решения (§13.10).
За счет перегрузки операции -> управляющий класс получает возможность контроля и выполнения каких-то операций при каждом обращении к объекту. Например, можно вести подсчет частоты использования объектов через управляющий класс:
template<class T> class Xhandle { T* rep; int count; public: T* operator->() { count++; return rep; }
// ... };
Нужна более сложная техника, если требуется выполнять операции как перед, так и после обращения к объекту. Например, может потребоваться множество с блокировкой при выполнении операций добавления к множеству и удаления из него. Здесь, по сути, в управляющем классе приходится дублировать интерфейс с объектами содержательной части:
class set_controller { set* rep; // ... public:
lock(); unlock();
virtual void insert(T* p) { lock(); rep->insert(p); unlock(); } virtual void remove(T* p) { lock(); rep->remove(p); unlock(); }
virtual int is_member(T* p) { return rep->is_member(p); }
virtual T* first() { return rep->first(); } virtual T* next() { return rep->next(); }
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий