#pragma once
// 智能指针
#include <iostream>
class U_OwnPtr;
class OwnPtr2;
// 拥有指针成员的类
class OwnPtr
{
public:
OwnPtr(int n, int *ptr):num(n),nPtr(ptr){}
int get_num() const { return num; }
void set_num(int n) { num = n; }
int* get_ptr() const { return nPtr; }
void set_ptr(int *ptr) { nPtr = ptr; }
int get_ptr_val() const { return *nPtr; }
void set_ptr_val(int n) {*nPtr = n;}
private:
int num;
int *nPtr;
};
class U_OwnPtr
{
private:
friend class OwnPtr2;
std::size_t nCount; // 计数
int *np; // 保存动态分配的内存指针
U_OwnPtr(int *p):nCount(1), np(p){}
~U_OwnPtr(){ delete np; np = NULL;}
};
class OwnPtr2
{
public:
OwnPtr2(int n, int *np):nVal(n), u_ptr(new U_OwnPtr(np)){}
OwnPtr2(const OwnPtr2 &refObj):nVal(refObj.nVal), u_ptr(refObj.u_ptr)
{
++u_ptr->nCount; // 使用计数加一
}
~OwnPtr2()
{
if(--u_ptr->nCount == 0)
{
delete u_ptr;
}
}
OwnPtr2 & operator=(const OwnPtr2 &rhs)
{
++rhs.u_ptr->nCount; // 右操作数加一
if(--u_ptr->nCount == 0) // 左操作数减一
{
delete u_ptr;
}
u_ptr = rhs.u_ptr;
nVal = rhs.nVal;
return *this;
}
int * get_ptr() const { return u_ptr->np;}
void set_ptr(int *p) { u_ptr->np = p;}
int get_ptr_val() const { return *u_ptr->np;}
void set_ptr_val(int v) { *u_ptr->np = v;}
private:
int nVal;
U_OwnPtr *u_ptr; // 保存一个智能指针对象指针
};
void TestOwnPtr();
智能指针
最新推荐文章于 2018-08-07 11:25:13 发布