64,647
社区成员
发帖
与我相关
我的任务
分享
class U_Ptr;
class HasPtr
{
public:
HasPtr(int *p,int i):ptr(new U_Ptr(p)),val(i){}
HasPtr(const HasPtr &orig):
ptr(orig.ptr),val(orig.val)
{
++ptr->use;
}
HasPtr& operator=(const HasPtr&);
~HasPtr(){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;}
int set_ptr_val(int i)const{*ptr->ip=i;}
private:
U_Ptr *ptr;
int val;
};
class U_Ptr
{
friend class HasPtr;
int *ip;
size_t use;
U_Ptr(int *p):ip(p),use(1){}
~U_Ptr(){delete ip;}
};
HasPtr& HasPtr::operator=(const HasPtr& other) //这个需不需要写noexcept
{
++other.ptr->use;
if(--ptr->use==0)delete ptr;
ptr=other.ptr;
val=other.val;
return *this;
}
//这个怎么没有移动构造和移动赋值函数
#include <exception>
#include <iostream>
class BasePtr;
class HandlePtr
{
public:
HandlePtr():ptr(nullptr),use(new size_t(1)){}
HandlePtr(const HandlePtr& i)
:ptr(i.ptr),use(i.use)
{
++*use;
}
HandlePtr(HandlePtr&& i)
:ptr(i.ptr),use(i.use)
{
}
HandlePtr(const BasePtr&);
~HandlePtr(){decr_use();}
HandlePtr& operator=(const HandlePtr&);
const BasePtr* operator->()const
{
if(ptr)return ptr;
else throw std::logic_error("unbound HandlePtr");
}
const BasePtr& operator*()const
{
if(ptr)return *ptr;
else throw std::logic_error("unbound HandlePtr");
}
private:
BasePtr* ptr;
size_t *use;
void decr_use()
{
if(--*use==0){delete ptr;delete use;}
}
};
HandlePtr::HandlePtr(const BasePtr& other)
:ptr(other.clone()),use(new size_t(1)){}
class BasePtr
{
public:
virtual BasePtr* clone()const
{
return new BasePtr(*this);
}
};
那两个智能指针怎么用呢。。 noexcept 表示函数内不会向外抛出异常,如果你不能保证,就不要加noexcept
noexcept 表示函数内不会向外抛出异常,如果你不能保证,就不要加noexcept