句柄
从代理类我们继续考虑,怎样可以避免对象复制呢,引出句柄
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;
}
句柄是什么?我们希望
Point p;
Handle h(p);
是将h绑定到p上,但这里有管理和控制的问题,什么时候删除p呢
Class Handle{
public:
Handle();
Handle(int,int);
Handle(const Point&);
Handle(const Handle&);
Handle& operate=(const Handle&);
~Handle();
int x() const;
Handle& x(int);
int y() const;
Handle& y(int);
}
允许多个句柄绑定到同一个对象上,则需要计数,但这个计数的属性不能是Handle类的,
因为如果这样,那减少一个应用要去修改其他句柄的计数。也不能是Point类的,因为这样就改了原来的代码了。
这样我们设计加入一个类负责为每个Point对象计数
Class UPoint{
private:
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类改成什么样呢:
Class Handle{
public:
Handle();
Handle(int,int);
Handle(const Point&);
Handle(const Handle& h):up(h.up){
++up->u;
}
Handle& operate=(const Handle& h){
++h.up->u;
if(--up->u==0)
delete up;
up = h->up;
return *this;
}
~Handle(){
if(--up->u == 0)
delete up;
}
int x() const {return up->p.x();}
Handle& x(int x0){
up->p.x(x0);
return *this;
}
int y() const {return up->p.y();}
Handle& y(int y0){
up->p.y(y0);
return *this;
}
private:
//后来新加的
Upoint * up;
}
这种是指针语义,永远不必复制UPoint对象,如果是需要值语义,则需要复制UPoint对象,保证UPoint不能同时被两个以上Handle所引用。
这可以通过看计数是否为1来判断。同时另外一种技术叫"Copy on write"写时复制。意思是对于不影响对象值的方法不去另外复制对象,
只有在会影响对象值的方法中去另外复制一个相同的对象:
Handle& Handle::x(int x0){
if(up->u != 1){//如果有两个句柄指向同一个对象,则这里的计数已经大于1了,只是因为不去修改对象的值,一直没有复制出另外一个对象。
--up->u;
up = new UPoint(up->p);
}
up->p.x(x0);
return *this;
}
这样的设计句柄有个缺点,就是需要定义一个具有类型为Point的成员的新类,这使得事情比较复杂,尤其是当要把Handle捆绑到Point的子类的时候。
怎样改进?这里有个方法,但并没有经常在使用的
class Handle{
public:
//no change
private:
Point* p; //去掉了UPoint
int* u;
}
//新构造出来的Handle,初始计数=1就可以了
Handle::Handle():u(new int(1),p(new Point())){}
Handle::Handle(int x,int y):u(new int(1),p(new Point(x,y))){}
Handle::Handle(const Point& p0):u(new int(1),p(new Point(p0))){}
//复制构造函数,指针,计数的int地址都相同,计数加1
Handle::Handle(Handle& h):u(h.u),p(h.p){++*u;}
//赋值操作,就是原来this的计数要减1,新的指针计数加1.
Handle& Handle::operate=(const Hanlde& h){
++*h.u;
if(--*u ==0){
delete u;
delete p;
}
u = h.u;
p = h.p;
return &this;
}
Handle::~Handle(){
if(--*u ==0 ){
delete u;
delete p;
}
}
再引申就是把int* u这个u定义出一个专门的类来。略。
分享到:
相关推荐
在C++编程中,句柄类是一种常见的设计模式,它用于封装对底层资源(如对象指针)的访问,提供安全、高效的管理机制。本文将深入探讨如何实现典型的句柄类,特别是在继承和多态环境下的应用。我们将讨论两种常用的...
第 1 节 句柄类的结构让我们开始讲句柄 (handle) 的第一篇文章,假如你想要在Open CASCADE 上开发软件的话,这篇文章虽然比较简单但是非常重要
在C++编程中,`CloseHandle`函数是一个重要的系统调用,主要用于关闭操作系统分配给程序的句柄。句柄是Windows操作系统中用于标识和访问对象的一种机制,如文件、设备、进程、线程等。使用`CloseHandle`函数能够有效...
在C++中实现句柄类可以带来诸如资源管理、安全性以及封装性等优势。 首先,我们需要理解句柄类的基本概念。句柄类通常包含一个内部指针,该指针指向实际的数据结构或对象。这个设计模式允许我们不直接暴露原始的...
本文件包含了实现句柄类的源文件,通常我们不能将基类和派生类对象同时存储在一个容器中,比如vector或者multiset,代码中通过利用句柄类解决了这个问题。详细解释可以参考博文...
【Hook学习笔记-----钩子的应用】 Hook,全称为“钩子”,是Windows操作系统提供的一种机制,允许应用程序在系统层面上监控特定类型的消息或事件。它实际上是一个处理消息的程序段,通过系统调用挂入系统,形成钩子...
本文将基于"C++查看窗口句柄的源码findwindow"这一主题,深入探讨如何使用C++编程语言来实现类似SPY++的功能,包括查找窗口句柄、获取窗口类名以及修改窗口标题。 首先,要实现查找窗口句柄,我们需要使用Windows ...
本主题聚焦于“获取模块-句柄-互斥体”的进阶操作,这些都是计算机编程和系统管理中的关键技术概念。 首先,让我们了解“模块”。在Windows操作系统中,模块通常指的是动态链接库(DLL)或可执行文件(EXE)。它们...
《Google C++ Style Guide》是谷歌为C++程序员制定的一份详细编码规范,旨在提高代码质量和团队协作效率。这份指南涵盖了多个方面的编程实践,包括头文件处理、作用域管理、类设计以及更多其他主题。 一、头文件 1....
根据提供的《C++编程思想》阅读笔记中的内容,我们可以从中提炼出以下详细的C++知识点: ### 1. 声明与定义的区别 - **声明**:声明是告诉编译器一个标识符的存在及其类型,但并不为其分配内存。例如使用`extern`...
在《Visual C++实践与提高——串口通信与工程应用篇》这本书中,作者张筠莉和刘书智深入探讨了如何利用Visual C++进行串口通信的实践和高级应用。 串口通信的基础知识包括串口的物理特性、通信参数如波特率、数据位...
在C++编程中,句柄和指针是两种不同的数据访问机制,它们都在不同场景下用于访问和操作内存中的对象。尽管两者都能通过一个较小的数据值来引用或控制大量数据,但它们的本质和用途有所不同。 首先,句柄是一个抽象...
C++基础辅助类库,比如异步进行-Thread,安全句柄-CHandle,资源守卫-Guard,XML解析-rapidxml,以及其他注册表、文件基础操作。用于更加高效、安全的进行C++开发。温馨提示:至少需要支持C++0x标准的编译器。 C++...
【文件夹同步的C++实现】在C++编程中,实现文件夹同步涉及到对操作系统级别的文件变化监测。这里主要依赖Windows API中的Find First Change Notification()和Find Next Change Notification()这两个函数,它们允许...
根据提供的《C++编程思想》阅读笔记的内容,我们可以总结出以下关键知识点: ### 1. 声明与定义 - **声明**:告知编译器一个标识符的存在及其类型,但并不分配内存空间。 - 例如使用 `extern` 关键字声明一个变量...
它返回一个句柄,后续的`WaitForSingleObject`函数将使用这个句柄来判断文件夹是否发生变化。 2. `WaitForSingleObject`:这是一个系统函数,用于等待指定对象的状态改变。在文件夹同步的场景中,它用来检查由`...
在C++编程中,"句柄"是一种间接访问操作系统资源的方式。它是一个整数值,用于标识和定位操作系统内部管理的对象,比如窗口、设备、线程等。VC6是Visual C++ 6.0的简称,是一款由Microsoft开发的C++集成开发环境。在...
在Linux操作系统中,句柄(Handle)是一种抽象的标识符,用于唯一地引用系统资源,如文件、设备、网络连接等。句柄的概念在很多不同的上下文中都有应用,但在这里我们主要关注它在Linux文件系统中的使用。在这个...
2. **安全句柄-CHandle**: `CHandle` 通常是指Windows API中的句柄,它是一种安全的方式管理操作系统级别的资源。在C++中,为了确保资源的正确释放,可能会实现一个类,这个类在析构时自动关闭句柄。使用智能指针...
资源介绍:通过句柄操作创建,发送文本消息,发送消息,禁止,可视,取标题, 取窗口风格,取窗口扩展风格,取当前句柄,取父句柄,取类名,取内容,取上一个句柄,取下一个句柄,取子句柄,通过标题创建,通标题...