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驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    VysorPro助手
    Play 2D games on Pixel running Android Nougat (N7.1.2) with Daydream View VR headset
    Play 2D games on Nexus 6P running Android N7.1.1 with Daydream View VR headset
    Native SBS for Android
    ADB和Fastboot最新版的谷歌官方下载链接
    How do I install Daydream on my phone?
    Daydream Controller手柄数据的解析
    蓝牙BLE传输性能及延迟分析
    VR(虚拟现实)开发资源汇总
    Android(Java)控制GPIO的方法及耗时分析
  • 原文地址:https://www.cnblogs.com/itdef/p/7830880.html
Copyright © 2011-2022 走看看