Материалы книги получены с http://www.itlibitum.ru/
Укзатели с подсчетом ссылок
Давайте усовершенствуем базовый класс RefCount и создадим модифицированный шаблон умного указателя для любых классов, производных от RefCount.
template <class Type>
class CP { // "Указатель с подсчетом ссылок"
private:
Type* pointee;
public:
CP(Type* p) : pointee(p) { pointee->Grab(); }
CP(const CP<Type>& cp) : pointee(cp.pointee)
{ pointee->Grab(); }
~CP() { ponintee->Release(); }
CP<Type>& operator=(const CP<Type>& cp)
{
if (this == &cp) return *this;
pointee->Release();
pointee = cp.pointee;
pointee->Grab();
return *this;
}
Type* operator->() { return pointee; }
};
Если весь клиентский код будет обращаться к классам с подсчетом ссылок через этот или аналогичный шаблон, подсчет ссылок осуществляется автоматически. При каждом создании новой копии указателя происходит автоматический вызов Grab(). При каждом уничтожении указателя его деструктор уменьшает значение счетчика. Единственная опасность заключается в том, что клиент обойдет умный указатель. С этой проблемой можно справиться с помощью производящих функций целевого класса.
class Foo : public RefCount {
private:
Foo(); // Вместе с другими конструкторами
public:
static CP<Foo> make(); // Создаем экземпляр
// Далее следует интерфейс Foo
};
Тем самым мы гарантируем, что доступ к Foo будет осуществляться только через указатель с подсчетом ссылок. Обратите внимание: это не ведущий, а самый обычный умный указатель.
Назад Содержание Далее
|