zoukankan      html  css  js  c++  java
  • 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驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    【学习总结】Git学习-参考廖雪峰老师教程二-安装Git
    【学习总结】Git学习-参考廖雪峰老师教程一-Git简介
    【学习总结】vi/vim命令是使用
    【学习总结】Git学习-参考廖雪峰老师教程-总
    【kindle笔记】之 《鬼吹灯》-9-20
    【学习总结】win7下安装Ubuntu双系统的日常
    【kindle笔记】之 《明朝那些事儿》-2018-7-1
    【kindle笔记】之 《黑客微百科》-2018-6-17
    【kindle笔记】之 《恶意》-2018-4-20
    【kindle笔记】之 《活着》-2018-2-5
  • 原文地址:https://www.cnblogs.com/itdef/p/7830880.html
Copyright © 2011-2022 走看看