管理指针成员(九)

三种方法

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;
}

你可能感兴趣的:(管理指针成员(九))