cpp中的句柄 (二)

如果希望用容器来保存因为继承而相关联的对象,若定义基类的容器,则当派生类被计入到容器中时,非基类部分将被切掉。为了解决这个问题,定义句柄。C++真正实现容器的面向对象无法通过对象本身,而必须通过指针或者引用。

Handle类又称为cover类。句柄类用来存储和管理基类的指针。指针所指对象的类型可以变化,它既可以指向基类类型对象又可以指向派生类的对象。用户通过句柄类访问继承层次的操作。因为句柄类使用指针执行操作,虚成员的行为将在运行时根据句柄实际绑定的对象的类型而变化。因此句柄掩盖了指针,用户不需要担心对指针的误操作。用户通过句柄来调用多态的函数。

句柄类有默认构造函数,复制构造函数和接受item_base对象的构造函数。最后一个构造函数接受基类对象,并且随基类对象一起存在。当复制基类对象时将复制指针而非对象,通过指针来管理副本。句柄内部存储两个指针,一个存储基类指针,另一个存储计数类的指针。因此多个句柄可以共享一个计数类。然后句柄会实现自己的解引用操作符号和转发操作符号。

在C++中,handle(句柄)是一个重要的概念,以下是其介绍、使用方法和相关知识: ### 介绍 - **通用句柄表示**:HANDLE是WINDOWS用来表示对象的通用句柄。在WINDOWS程序里,存在各种资源如窗口、图标、光标等,系统创建这些资源时会分配内存,并返回标示这些资源的标示号,即句柄。当对象在内存中的位置改变时,HANDLE固定不变,而对象地址会变,可通过HANDLE记录对象的最新地址,它就像中间商,联络着WINDOWS API和看不见的对象,能通过它让对象执行操作,防止操作系统受到不利操作 [^2]。 - **句柄类(智能指针)**:句柄类(智能指针smart point)是存储指向动态分配(堆)对象指针的类。除了能在适当时间自动删除指向的对象外,工作机制类似C++的内置指针。智能指针在面对异常时很有用,能确保正确销毁动态分配的对象,还可用于跟踪被多用户共享的动态分配对象。句柄类存储和管理基类指针,指针指向对象的类型可变化,能指向基类或派生类型对象。用户通过句柄类访问继承层次的操作,虚成员的行为会在运行时根据句柄实际绑定的对象类型变化,实现C++运行时动态绑定,用户可获得动态行为且无需操心指针管理 [^3]。 ### 使用方法 - **获取标准输入、输出、错误句柄**:在控制台编程中,常用到STD_INPUT_HANDLE、STD_OUTPUT_HANDLE、STD_ERROR_HANDLE,将它们作为参数传递给GetStdHandle函数来获取相应的句柄 [^1]。示例代码如下: ```cpp #include <iostream> #include <windows.h> int main() { HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE); HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE); HANDLE hError = GetStdHandle(STD_ERROR_HANDLE); if (hInput == INVALID_HANDLE_VALUE || hOutput == INVALID_HANDLE_VALUE || hError == INVALID_HANDLE_VALUE) { std::cerr << "Failed to get standard handles." << std::endl; return 1; } // 可以使用这些句柄进行后续操作 return 0; } ``` - **从进程中获取窗口句柄**:可通过进程ID、进程句柄和标题名称从进程中获取Window Handle的唯一窗口。使用进程ID填充用于通信的结构,触发顶级窗口的枚举,并返回窗口句柄。调用SetLastError和GetLastError是必要的,因为在这种情况下EnumWindows返回FALSE表示错误和成功 [^5]。 ### 相关知识 - **句柄与对象的映射方式**:在windows中,句柄与对象存在两种映射方式。一是全等映射,即句柄本身就是一个指针,映射只是类型转换,如进程实例句柄、模块句柄以及资源句柄等;是基于表格的映射,这是对象指针与句柄之间最普通的映射机制,操作系统创建表格并保存所有要考虑的对象,创建新对象时先在表格中找空入口,添入表示对象的数据,对象删除时,释放其数据成员和表中的入口 [^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值