一个简单的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;
};

全部代码如下:

 // sample0.cpp: 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream> class Point {
public:
Point():xval(),yval(){}
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;
}; class UPoint {
friend class Handle;
Point p;
int u; UPoint() :u() {}
UPoint(int x, int y) :p(x, y), u() {}
UPoint(const Point& p0):p(p0),u(){}
}; 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;
}; Handle::Handle() :up(new UPoint) {}
Handle::Handle(int x, int y) : up(new UPoint(x, y)) {}
Handle::Handle(const Point& p) : up(new UPoint(p)) {} Handle::~Handle() {
if (up->u == )
delete up;
} Handle::Handle(const Handle& h) :up(h.up) { ++up->u; }
Handle& Handle::operator=(const Handle& h) {
++h.up->u;
if (--up->u == ) {
delete up;
}
return *this;
} int Handle::x()const { return up->p.x(); }
int Handle::y()const { return up->p.y(); } Handle& Handle::x(int x0)
{
up->p.x(x0);
return *this;
} Handle& Handle::y(int y0) {
up->p.y(y0);
return *this;
} int main()
{
Handle h;
std::cout << h.x() << " " << h.y() << std::endl;
return ;
}

c++沉思录 学习笔记 第六章 句柄(引用计数指针雏形?)的更多相关文章

  1. c++沉思录 学习笔记 第五章 代理类

    Vehicle 一个车辆的虚基类 class Vehicle {public: virtual double weight()const = 0; virtual void start() = 0; ...

  2. JVM学习笔记-第六章-类文件结构

    JVM学习笔记-第六章-类文件结构 6.3 Class类文件的结构 本章中,笔者只是通俗地将任意一个有效的类或接口锁应当满足的格式称为"Class文件格式",实际上它完全不需要以磁 ...

  3. C Primer Plus 学习笔记 -- 前六章

    记录自己学习C Primer Plus的学习笔记 第一章 C语言高效在于C语言通常是汇编语言才具有的微调控能力设计的一系列内部指令 C不是面向对象编程 编译器把源代码转化成中间代码,链接器把中间代码和 ...

  4. Linux学习笔记(第六章)

    第六章-档案权限与目录配置#chgrp:改变档案的所属群组#chown:改变档案的拥有者#chmod:改变档案的权限及属性 chown用法 chmod用法: r:4 w:2 x:1对于文档: 对于目录 ...

  5. o'Reill的SVG精髓(第二版)学习笔记——第六章

    第六章:坐标系统变换 想要旋转.缩放或者移动图片到新的位置.可以给对应的SVG元素添加transform属性. 6.1 translate变换 可以为<use>元素使用x和y属性,以在特性 ...

  6. 学习笔记 第六章 使用CSS美化图片

    第六章  使用CSS美化图片 6.1  在网页中插入图片 GIF图像 跨平台能力,无兼容性问题: 具有减少颜色显示数目而极度压缩文件的能力,不会降低图像的品质(无损压缩): 支持背景透明功能,便于图像 ...

  7. Java 学习笔记 ------第六章 继承与多态

    本章学习目标: 了解继承的目的 了解继承与多态的关系 知道如何重新定义方法 认识java.lang.object 简介垃圾回收机制 一.继承 继承是java面向对象编程技术的一块基石,因为它允许创建分 ...

  8. 《Python基础教程(第二版)》学习笔记 -> 第六章 抽象

    抽象和结构 本章将会介绍如何让将语句组织成函数,还会详细介绍参数(parameter)和作用域(scope)的概念,以及递归的概念及其在程序中的用途. 创建函数 函数可以调用,它执行某种行为,并返回某 ...

  9. [Python学习笔记][第六章Python面向对象程序设计]

    1月29日学习内容 Python面向对象程序设计 类的定义与使用 类定义语法 使用class关键词 class Car: def infor(self): print("This is ca ...

随机推荐

  1. Windows IIS安装php

    [可参考文档:https://docs.microsoft.com/en-us/iis/application-frameworks/scenario-build-a-php-website-on-i ...

  2. Reference.svcmap: Could not load file or assembly

    Reference.svcmap: Could not load file or assembly 在添加服务的时候出现如上错误, 把这个勾去掉就可以了.

  3. [转]Java事件处理机制- 事件监听器的四种实现方式

    原文来自http://stefan321.iteye.com/blog/345221 自身类作为事件监听器 外部类作为事件监听器 匿名内部类作为事件监听器 内部类作为事件监听器 自身类作为事件监听器: ...

  4. 配置iis支持json解析,配置ssi

    配置json解析: 添加mime:*.json  类型 text/json 安装iis应用程序开发中的asp功能 添加处理程序映射: 添加脚本映射 请求路径:*.json 可执行文件:C:\Windo ...

  5. Oracle 学习笔记(六)

    Oracle 数据库常用的闪回sql 语句及其它操作语句: --Oracle 数据库dml sql -- 查看当前用户所拥有的表 select * from tab; --表空间,auto: 自动管理 ...

  6. sql常用语句备忘录随时更新

    一.查询最新的一条数据 SELECT * FROM Table a WHERE NOT EXISTS (SELECT FROM Table b WHERE a.Date>b.Date) 二.查询 ...

  7. python:win下将py文件打包成exe

    [环境]windows,正常运行的python文件 1.安装pyinstaller ,cmd下执行以下命令,需看到安装成功界面 pip install pyinstaller 2.cmd中进入要打包的 ...

  8. leetcode136

    public class Solution { public int SingleNumber(int[] nums) { Dictionary<int, int> dic = new D ...

  9. ssh服务器配置

    使用如下终端命令可以在 Linux 主机中安装 ssh服务器sudo apt-get install openssh-server lin@lin-machine:~$ sudo apt-get in ...

  10. 去BAT,你应该要看一看的面试经验总结(转)

    来源微信公众号『easyserverdev』 http://mp.weixin.qq.com/s/UZljzFMjobo1wzCguY7NDg 说下我的面试经验吧,都是亲身经历,不喜勿喷: 我去年12 ...