Материалы книги получены с http://www.itlibitum.ru/
Шаблон сильного дескриптора
Шаблон сильного дескриптора идентичен шаблону слабого, за исключением того, что он поддерживает счетчик ссылок для указателя.
template <class Type>
class SH {
private:
BMP<Type>* pointer;
public:
SH() : pointer(new BMP<Type>(new Type)) { pointer->Grab(); }
SH(const SH<Type>& h) : pointer(h.pointer) { pointer->Grab(); }
SH(const WH<Type>& h) : pointer(h.pointer) { pointer->Grab(); }
operator WH<Type>() { return WH<Type>(pointer); }
SH<Type>& operator=(const SH<Type>& h)
{
if (this == &h) return *this;
if (pointer == h.pointer) return *this;
pointer->Release();
h.pointer->Grab();
return *this;
}
BMP<Type>& operator->() { return *pointer; }
};
Шаблон используется для обычных переменных (а не для переменных класса), ссылающихся на объекты. Благодаря конструктору, принимающему H<Type>, и операторной функции operator H<Type>() он также может использоваться в операциях присваивания с участием переменных классов, то есть слабых дескрипторов.
class Bar {
private:
WH<Foo> foo;
public:
void f();
};
void Bar::f()
{
SH<Foo> f; // Эквивалентно Foo* f = new Foo;
f = foo; // Использует operator=(SH<Type>(foo));
foo = f; // Использует operator WH<Type>(f);
}
Назад Содержание Далее
|