|
Ведущие указатели с подсчетом ссылок Даже если вы не хотите модифицировать конкретный класс, чтобы сделать его производным от RefCount (например, если он имеет критические требования по быстродействию и объему или входит в коммерческую библиотеку классов), не отчаивайтесь. Подсчет ссылок можно переместить в ведущий указатель. template <class Type> class CMP { // "Ведущий указатель с подсчетом ссылок" private: Type* pointee; unsigned long count; public: CMP() : pointee(new Type), count(0) {} CMP(const CMP<Type>& cmp) : pointee(new Type(*(cmp.pointee))), count(0) {} ~CMP() { delete pointee; } // Независимо от счетчика CMP<Type>& operator=(const CMP<Type>& cmp) { if (this == &cmp) return *this; delete pointee; pointee = new Type(*(cmp.pointee)); return *this; } Type* operator->() const { return pointee; } void Grab() { count++; } void Release() { if (count > 0) count--; if (count <= 0) { delete pointee; delete this; } } }; В сущности, это равносильно объединению старого шаблона ведущего указателя с базовым классом RefCount. Подсчет ссылок уже не выделяется в отдельный класс, но зато нам снова приходится полагаться на правильное поведение программистов - существ, к сожалению, несовершенных. |
Copyright 2005. Климов Александр. All Right Reserved.