zoukankan      html  css  js  c++  java
  • 句柄的使用

    #include <iostream>
    class Point{
    public:
    Point():xv(
    0),yv(0){}
    Point(
    int a, int b):xv(a), yv(b){}
    Point(
    const Point &p):xv(p.xv), yv(p.yv){}
    int x() const {return xv;}
    int y() const {return yv;}
    Point
    & x(int x){xv = x; return *this;}
    Point
    & y(int y){yv = y; return *this;}
    private:
    int xv;
    int yv;
    };
    class Point3D:public Point{
    public:
    Point3D():zv(
    0){}
    private:
    int zv;
    };

    class Handler{
    public:
    Handler():p(
    0), use(new int(1)){}
    Handler(
    const Point &p0):p(new Point(p0)), use(new int(1)){};//必须new
    Handler(const Handler &i):p(i.p), use(i.use){++*use;}
    ~Handler(){decr_use();}
    Handler
    & operator=(const Handler &);
    Point
    * operator->()const{if(p)return p;}//这里可以是const的,那样的话就不能改变point内的值了
    Point & operator*()const{if(p)return *p;}

    private:
    Point
    *p;
    int *use;
    void decr_use()
    {
    if(--*use == 0){delete p; delete use;}}

    };
    /*
    Handler::Handler(const Point &point)
    {
    p = point;
    use = 1;
    }
    */
    Handler
    &
    Handler::
    operator=(const Handler &h)
    {
    ++*h.use;
    decr_use();
    p
    = h.p;
    use
    = h.use;
    return *this;
    }
    main()
    {
    Point p(
    1,2);

    Handler h(p);
    Point3D p3d;
    h
    = p3d;
    h
    ->x(6);
    h
    ->y(6);
    cout
    <<"point x = "<<h->x()<<" point y = "<<h->y()<<endl;
    }

    一个简单的句柄例子,注意注释里的几点。

    C++语言的一个问题就是不支持使用对象进行面向对象编程,而是必须使用指针和引用。常用的解决方案是句柄和包装。句柄类存储和管理基类的指针,指针指向锁只对象的类型是可以变化的,既可以指向基类也可以指向派生类,用户通过句柄来访问继承层次的操作。句柄带来的好处就是可以获得动态行为,但无需操心指针的管理。

  • 相关阅读:
    02 小白新一天
    集合排序
    匿名内部类-Lambda表达式
    设计模式之适配器设计
    设计模式之代理设计
    设计模式之工厂设计
    依赖倒转原则
    多态及练习题
    在一个类中调用另外一个类
    对象的三大特性之封装
  • 原文地址:https://www.cnblogs.com/macula7/p/1964851.html
Copyright © 2011-2022 走看看