Материалы книги получены с http://www.itlibitum.ru/
Иерархия умных указателей
Вместо использования шаблонов можно поддерживать параллельные иерархии указателей и объектов, на которые они указывают. Делать это следует лишь в том случае, если ваш компилятор не поддерживает шаблоны или плохо написан.
class PVoid { // Заменяет void*
protected:
void* addr;
public:
PVoid() : addr(NULL) {}
PVoid(void* a) : addr(a) {}
operator void*() { return addr; }
};
class Foo : public PVoid {
public:
PFoo() : PVoid() {}
PFoo(Foo* p) : PVoid(p) {}
operator Foo*() { return (Foo*)addr; }
Foo* operator->() { return (Foo*)addr; }
77
};
class Pbar : public PFoo {
public:
PBar() : PFoo() {}
PBar(Bar* p) : PFoo(p) {}
operator Bar*() { return (Bar*)addr; }
Bar* operator->() { return (Bar*)addr; }
};
pBar pb(new Bar);
pFoo pf(pb); // Работает, потому что PBar является производным от PFoo
pf->MemberOfFoo(); // Работает благодаря PFoo::operator->
Этот вариант будет работать, если вас не огорчают многочисленные копирования/вставки текста и (в зависимости от компилятора) предупреждения о том, что РВаr::operator->() скрывает PFoo::operator->(). Конечно, такое решение не настолько элегантно, как встроенные типы указателей шаблона Ptr.
Назад Содержание Далее
|