这两个智能指针怎么用啊。

Zxy0918520 2016-12-03 11:09:01
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需不需要写呢。。还有就是能不能在main里面写个列子让我知道怎么用这个智能指针。。拜托了。
...全文
205 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zxy0918520 2016-12-04
  • 打赏
  • 举报
回复
来人帮忙。。
Zxy0918520 2016-12-04
  • 打赏
  • 举报
回复
有人么。。。。
paschen 版主 2016-12-03
  • 打赏
  • 举报
回复
noexcept 表示函数内不会向外抛出异常,如果你不能保证,就不要加noexcept
Zxy0918520 2016-12-03
  • 打赏
  • 举报
回复
引用 4 楼 paschen 的回复:
引用 3 楼 Zxy0918520 的回复:
[quote=引用 1楼paschen 的回复:]noexcept 表示函数内不会向外抛出异常,如果你不能保证,就不要加noexcept
那两个智能指针怎么用呢。。
直接构造对象然后使用呗,由于重载了operator->与operator*,所以可以直接像指针一样调用这两个运算符[/quote]能写个给我看看么。。
paschen 版主 2016-12-03
  • 打赏
  • 举报
回复
引用 3 楼 Zxy0918520 的回复:
引用 1楼paschen 的回复:
noexcept 表示函数内不会向外抛出异常,如果你不能保证,就不要加noexcept
那两个智能指针怎么用呢。。
直接构造对象然后使用呗,由于重载了operator->与operator*,所以可以直接像指针一样调用这两个运算符
Zxy0918520 2016-12-03
  • 打赏
  • 举报
回复
引用 1楼paschen 的回复:
noexcept 表示函数内不会向外抛出异常,如果你不能保证,就不要加noexcept
那两个智能指针怎么用呢。。

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧