С++ - язык, который изучается постепенно.ГЛАВА 14. Укзатели с подсчетом ссылок
                   Справочники Всё для создания сайта

Ссылки


Home
Бизнес
Справочники
Советы







Материалы книги получены с 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 будет осуществляться только через указатель с подсчетом ссылок. Обратите внимание: это не ведущий, а самый обычный умный указатель.


Назад    Содержание    Далее    

Home  Создание сайтов  Учебник по записи CD  Справочник Web дизайнера Самоучитель IE PHP и MySQL Компьютерные сети С++ E-mail me

Copyright 2007. Климов Александр. All Right Reserved.
Hosted by uCoz