三种方法
1.常规指针类(浅复制)
缺点:野指针
2.智能指针类(计数类)
避免野指针(悬垂指针)
3.值型类(深复制)
===================================
class AHasPtr
{
public:
AHasPtr(int *p,int i):ptr(p),val(i){}
int *get_prt() 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) { *ptr = val;}
private:
int val;
i nt *ptr;
};
===========================================================
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_prt() 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) { *ptr = val;}
private:
int val;
int *ptr;
};
CHasPtr & CHasPtr::operator=(const CHasPtr &rhs)
{
*ptr = *rhs.ptr;
val = rhs.val;
return *this;
}
=================================================================
class U_Ptr
{
friend class BHasPtr;
private:
int *ip;
int 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_prt() 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) { *ptr->ip = val;}
private:
int val;
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;
}
#include <iostream>
#include <string>
#include <vector>
#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_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;
}
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;
cout <<"修改以后"<<endl;
ptr2.set_ptr_val(6);
ptr2.set_int(48);
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;
test_CHasPtr();
cout << "智能指针============="<<endl;
test_BHasPtr();
return 0;
}