C++-潜复制-深复制-智能指针

主函数:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值