class HasPtr;
class U_ptr
{
friend class HasPtr;
int *ip;
size_t use;
U_ptr(int* p):ip(p),use(1){}
~U_ptr(){ delete ip;}
};
class HasPtr
{
public:
HasPtr( int *p,int i=0 ):ptr( new U_ptr(p)),val(i) {}
HasPtr( const HasPtr& Other ):ptr( Other.ptr ),val( Other.val ) { ++ ptr->use;}
HasPtr& operator = (const HasPtr& Other);
~HasPtr()
{ if ( --ptr->use == 0 )
{
delete ptr;
}
}
private:
int val;
U_ptr *ptr;
};
HasPtr& HasPtr::operator =(const HasPtr& Other)
{
++Other.ptr->use;
if ( --ptr->use == 0)
{
delete ptr;
}
ptr = Other.ptr;
val = Other.val;
return *this;
}