|
Шаблон сильного дескриптора Шаблон сильного дескриптора идентичен шаблону слабого, за исключением того, что он поддерживает счетчик ссылок для указателя. 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); } |
Copyright 2006. Климов Александр. All Right Reserved.