|
Иерархия умных указателей Вместо использования шаблонов можно поддерживать параллельные иерархии указателей и объектов, на которые они указывают. Делать это следует лишь в том случае, если ваш компилятор не поддерживает шаблоны или плохо написан. 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. |
Copyright 2005. Климов Александр. All Right Reserved.