template class RCPointer { Item *item; unsigned *rc; public: RCPointer(Item *i) : item(i), rc(new unsigned(1)) {} RCPointer(const RCPointer &rcp) : item(rcp.i), rc(rcp.rc) { ++*rc; } virtual ~RCPointer() { if(--*rc==0) { delete rc; delete item; } } RCPointer& operator=(const RCPointer &rcp) { if(--*rc==0) { delete rc; delete item; } item=rcp.item; ++*(rc=rcp.rc); } Item& operator*() { return *item; } const Item& operator*() const { return *item; } Item* operator->() { return item; } const Item* operator->() const { return item; } };