主函数:
#include <iostream>
#include "plain-ptr.h"
#include "value-ptr.h"
#include "smart-ptr.h"
using namespace std;
void test_AHasPtr()
{
int i = 42;
AHasPtr p1(&i,42);
AHasPtr p2=p1;
cout << p2.get_ptr_val()<< endl;
p1.set_ptr_val(0);
cout << p2.get_ptr_val() << endl;
int* ip = new int(42);
AHasPtr ptr(ip, 10);
cout << ptr.get_ptr_val() << endl;
delete ip;
cout << ptr.get_ptr_val() << endl;
}
void test_CHasPtr()
{
int obj = 0;
CHasPtr ptr1(obj, 42);
CHasPtr ptr2(ptr1);
cout << ptr1.get_ptr_val() << ", " << ptr1.get_int() << endl;
cout << ptr2.get_ptr_val() << ", " << ptr2.get_int() << endl;
ptr2.set_ptr_val(6);
ptr2.set_int(48);
cout << "修改以后:" << endl;
cout << ptr1.get_ptr_val() << ", " << ptr1.get_int() << endl;
cout << ptr2.get_ptr_val() << ", " << ptr2.get_int() << endl;
}
void test_BHasPtr()
{
int obj = 0;
BHasPtr ptr1(&obj, 42);
BHasPtr ptr2(ptr1);
cout << ptr1.get_ptr_val() << ", " << ptr1.get_int() << endl;
cout << ptr2.get_ptr_val() << ", " << ptr2.get_int() << endl;
cout << "修改以后: " << endl;
ptr2.set_ptr_val(2);
ptr2.set_int(22);
cout << ptr1.get_ptr_val() << ", " << ptr1.get_int() << endl;
cout << ptr2.get_ptr_val() << "," << ptr2.get_int() << endl;
}
int main()
{
cout << "常规指针:" << endl;
test_AHasPtr();
cout << endl << "值型类:" << endl;
test_CHasPtr();
cout << endl << "智能指针:" << endl;
test_BHasPtr();
return 0;
}
pain-ptr.h:
class AHasPtr
{
public:
AHasPtr(int* p, int i) :ptr(p), val(i) {}
int* get_ptr() const { return ptr; }
int get_int() const { return val; }
void set_ptr(int* p) { ptr = p; }
void set_int(int i) { val = i; }
int get_ptr_val() const { return *ptr; }
void set_ptr_val(int val) const { *ptr = val; }
private:
int val;
int* ptr;
};
value-ptr.h:
class CHasPtr
{
public:
CHasPtr(const int& p, int i)
:ptr(new int(p)), val(i)
{}
CHasPtr(const CHasPtr& orig)
:ptr(new int(*orig.ptr)), val(orig.val) {}
CHasPtr& operator = (const CHasPtr&);
~CHasPtr() { delete ptr; }
int* get_ptr() const { return ptr; }
int get_int() const { return val; }
void set_ptr(int* p) { ptr = p; }
void set_int(int i) { val = i; }
int get_ptr_val() const { return *ptr; }
void set_ptr_val(int val) const { *ptr = val; }
private:
int val;
int *ptr;
};
CHasPtr& CHasPtr::operator = (const CHasPtr& rhs)
{
*ptr = *rhs.ptr;
val = rhs.val;
return *this;
}
smart-ptr.h:
不知道为什么加上~U_Ptr()会出错。。原因可能是和BHasPtr的析构函数冲突,两者同时存在就会出错。
class U_Ptr
{
friend class BHasPtr;
private:
int* ip;
size_t use; //计数
U_Ptr(int* p):ip(p), use(1){}
//~U_Ptr() { delete ip; }
};
class BHasPtr
{
public:
BHasPtr(int* p, int i)
:ptr(new U_Ptr(p)), val(i) {}
BHasPtr(const BHasPtr& orig)
:ptr(orig.ptr), val(orig.val)
{
++ptr->use;
}
BHasPtr& operator=(const BHasPtr&);
~BHasPtr()
{
if (--ptr->use == 0) delete ptr;
}
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 val)const { *ptr->ip = val; }
private:
int val;
//int* ptr;
U_Ptr* ptr;
};
BHasPtr& BHasPtr::operator =(const BHasPtr& rhs)
{
++rhs.ptr->use;
if (--ptr->use == 0) delete ptr;
ptr = rhs.ptr;
val = rhs.val;
return *this;
}