#include <iostream>
using namespace std;
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): ptr(new U_Ptr(p)),val(i) { }
HasPtr(const HasPtr &orig)
{
ptr=orig.ptr;
val=orig.val;
++ptr->use;
}
HasPtr &operator = (const HasPtr &);
int *get_ptr() const
{
return ptr->ip;
}
int get_int() const
{
return val;
}
void set_ptr(int *p)
{
ptr->ip = p;
}
void set_int(int i)
{
val = i;
}
int get_ptr_val() const
{
return *ptr->ip;
}
void set_ptr_val(int i)
{
*ptr->ip = i;
}
~HasPtr()
{
cout<<"load detructor!"<<endl;
if (ptr->use==0)//注意这儿并需要--
{
delete ptr;
}
}
private:
U_Ptr *ptr;
int val;
};
HasPtr& HasPtr::operator = (const HasPtr &rhs)
{
++rhs.ptr->use;
if (rhs.ptr->use==0)//注意这儿并需要--
{
delete ptr;
}
ptr=rhs.ptr;
val=rhs.val;
return *this;
}
int main()
{
int obj = 0;
HasPtr ptr1(&obj, 42);
HasPtr ptr2(ptr1);
HasPtr ptr3(ptr2);
return 0;
}