打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C++ 沉思录——句柄——智能指针改写
userphoto

2014.10.25

关注

  C++ 沉思录也算是C++中的经典书籍,其中介绍OO思想的我觉得很好,但是全书中贯穿了handle,使用引用计数等,也有点不适合现代C++的设计思想。这里使用shared_ptr 智能指针改写了“句柄”这一章的程序,明显使代码量下降,而且管理方便。下面来看代码:

#include <iostream>#include <memory>using namespace std;class Point{public:    Point() : xval(0),yval(0){};    Point(int x, int y): xval(x), yval(y){};    Point(const Point & p)    {        if(this == &p)            return ;        this->xval = p.x();        this->yval = p.y();    }    int x() const {return xval;};    int y() const {return yval;};    Point& x(int xv)     {         xval = xv;         return *this;    };    Point& y(int yv)     {         yval = yv;         return *this;    };private:    int xval, yval;};class Handle{                       //句柄类public:    Handle(): up(new Point){};    Handle(int x,int y): up(new Point(x,y)){};//按创建Point的方式构造handle,handle->UPoint->Point    Handle(const Point& p): up(new Point(p)){};//创建Point的副本    Handle(const Handle& h): up(h.up){ /*++up->u;*/ };//此处复制的是handle,但是底层的point对象并未复制,只是引用计数加1    Handle& operator=(const Handle& h)    {        up = h.up;        return *this;    };    ~Handle()    {    };    int x() const{return up->x();};    Handle& x(int xv)    {        up->x(xv);         return *this;    };    int y() const{return up->y();};    Handle& y(int yv)    {        up->y(yv);         return *this;    };    int OutputU()    {        return up.use_count();    }   //输出引用个数private:    shared_ptr<Point> up;};int main(){    //Point *p = new Point(8,9);     Point p(8,9);    //Point p1 = p.x(88);    //Point *pp = &p;    Handle h1(1,2);    Handle h2 = h1;        //此处调用的是构造函数Handle(const Handle& h)    h2.x(3).y(4);               //此处的特殊写法是因为写xy函数内返回了对象    Handle h3(5,6);        //此处调用Handle的赋值运算符重载函数Handle& operator=(const Handle& h)    h1 = h3;    Handle h4(p);    Handle h5(h4);    h4.x(7).y(8);    //Handle h5(p1);    //Handle h5 = h4;    cout <<"h1(" << h1.x() <<":"<< h1.y() << "):" << h1.OutputU() <<endl;    cout <<"h2(" << h2.x() <<":"<< h2.y() << "):" << h2.OutputU() <<endl;    cout <<"h3(" << h3.x() <<":"<< h3.y() << "):" << h3.OutputU() <<endl;    cout <<"h4(" << h4.x() <<":"<< h4.y() << "):" << h4.OutputU() <<endl;    cout <<"h5(" << h5.x() <<":"<< h5.y() << "):" << h5.OutputU() <<endl;    //delete pp; //不能这样,不是用new分配的空间    //cout <<"h5(" << h5.x() <<":"<< h5.y() << "):" << h5.OutputU() <<endl;    cout<<p.x()<<" "<<p.y()<<endl;    //cout<<&p1<<endl;    return 0;}

运行结果:

C:\Windows\system32\cmd.exe /c handle_sharedptr.exe
h1(5:6):2
h2(3:4):1
h3(5:6):2
h4(7:8):2
h5(7:8):2
8 9
Hit any key to close this window...

可见这里的结果和“句柄”这里的完全一样。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
placement new体验
(转) C,C 多线程编程
C++使用内存映射文件入门
C++ Handle(句柄) part1
遍历读取指定文件夹下指定类型的所有文件
C++中使用内存映射文件存取struct,并用指针访问
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服