• c++沉思录 学习笔记 第六章 句柄(引用计数指针雏形?)


    一个简单的point坐标类

    class Point {
    public:
    Point():xval(0),yval(0){}
    Point(int x,int y):xval(x),yval(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;
    };

    将handle 绑定到其上 进行一层封装

    通过handle控制那些操作可以公开 那些操作私有 阻止用户对point的地址的操作

    更重要的是提供 point的引用计数 将多个handle绑定到ppint上 当全部释放对point的使用权时

    才进行释放point的操作

    那么增加两个类 

    一个引用计数类 class UPoint

    class UPoint {
    friend class Handle;
    Point p;
    int u;

    UPoint() :u(1) {}
    UPoint(int x, int y) :p(x, y), u(1) {}
    UPoint(const Point& p0):p(p0),u(1){}
    };

    一个是handle句柄类  包含UPoint的指针  构造和析构的时候会将计数+1 

    当计数到0 则释放指针内存

    class Handle {
    public:
    Handle();
    Handle(int, int);
    Handle(const Point&);
    Handle(const Handle&);
    Handle& operator=(const Handle&);
    ~Handle();
    int x()const;
    Handle& x(int);
    int y()const;
    Handle& y(int);
    private:
    UPoint* up;
    };

     

    全部代码如下:

     1 // sample0.cpp: 定义控制台应用程序的入口点。
     2 //
     3 
     4 #include "stdafx.h"
     5 #include <iostream>
     6 
     7 class Point {
     8 public:
     9     Point():xval(0),yval(0){}
    10     Point(int x,int y):xval(x),yval(y){}
    11     int x()const { return xval; }
    12     int y()const { return yval; }
    13     Point& x(int xv) { xval = xv; return *this; }
    14     Point& y(int yv) { yval = yv; return *this; }
    15 private:
    16     int xval, yval;
    17 };
    18 
    19 class UPoint {
    20     friend class Handle;
    21     Point p;
    22     int u;
    23 
    24     UPoint() :u(1) {}
    25     UPoint(int x, int y) :p(x, y), u(1) {}
    26     UPoint(const Point& p0):p(p0),u(1){}
    27 };
    28 
    29 class Handle {
    30 public:
    31     Handle();
    32     Handle(int, int);
    33     Handle(const Point&);
    34     Handle(const Handle&);
    35     Handle& operator=(const Handle&);
    36     ~Handle();
    37     int x()const;
    38     Handle& x(int);
    39     int y()const;
    40     Handle& y(int);
    41 private:
    42     UPoint* up;
    43 };
    44 
    45 Handle::Handle() :up(new UPoint) {}
    46 Handle::Handle(int x, int y) : up(new UPoint(x, y)) {}
    47 Handle::Handle(const Point& p) : up(new UPoint(p)) {}
    48 
    49 Handle::~Handle() {
    50     if (up->u == 0)
    51         delete up;
    52 }
    53 
    54 Handle::Handle(const Handle& h) :up(h.up) { ++up->u; }
    55 Handle& Handle::operator=(const Handle& h) {
    56     ++h.up->u;
    57     if (--up->u == 0) {
    58         delete up;
    59     }
    60     return *this;
    61 }
    62 
    63 int Handle::x()const { return up->p.x(); }
    64 int Handle::y()const { return up->p.y(); }
    65 
    66 Handle& Handle::x(int x0)
    67 {
    68     up->p.x(x0);
    69     return *this;
    70 }
    71 
    72 Handle& Handle::y(int y0) {
    73     up->p.y(y0);
    74     return *this;
    75 }
    76 
    77 
    78 int main()
    79 {
    80     Handle h;
    81     std::cout << h.x() << " " << h.y() << std::endl;
    82     return 0;
    83 }
    View Code

     

    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    Spring Cloud Ribbon实现客户端负载均衡
    Spring Boot 初步小结
    日志配置
    外部属性文件的使用
    运行jar
    类型安全的配置文件
    java动态代理中的invoke方法是如何被自动调用的(转)
    数据库为什么要用B+树结构--MySQL索引结构的实现(转)
    Java transient关键字使用小记(转)
    面试题思考:Java 8 / Java 7 为我们提供了什么新功能
  • 原文地址:https://www.cnblogs.com/itdef/p/7830880.html
Copyright © 2020-2023  润新知