c++中 句柄类是什么

 我来答
帐号已注销
2012-02-09 · TA获得超过9901个赞
知道大有可为答主
回答量:4076
采纳率:0%
帮助的人:3597万
展开全部
VC 中的句柄 HANDLE 其实是一个 void * 类型。像 C 语言中的 FILE 一样,它是个结构体,FILE * 其实是一个结构体地址类型。句柄在 Windows 系统中类似于指针,它就是个指针类型,但是又和指针不同。比如分配一块可移动的内存,你可以得到一个固定的句柄,但是这块内存的指针是不固定的。句柄还有其他很多种,都是通过 HANDLE 定义而来的。在 Windows 编程中,句柄代表系统中唯一一个对象,比如文件句柄、图标句柄、字体句柄、位图句柄、画刷句柄、设备环境句柄、应用程序模块句柄、进程句柄、窗口句柄等。由于 Windows 是封闭的,微软提供很多现成的函数(Windows API),句柄就是访问这类对象的一个 "指针",通过句柄才能访问这些对象。

HANDLE 类型在 Windows SDK 头文件定义如下:
typedef void *PVOID;
typedef PVOID HANDLE; //文件句柄、进程句柄等
typedef HANDLE HICON; //图标句柄
typedef HANDLE HFONT; //字体句柄
typedef HANDLE HBITMAP; //位图句柄
typedef HANDLE HBRUSH; //画刷句柄
typedef HANDLE HDC; //设备环境句柄
typedef HANDLE HMODULE; //模块句柄
typedef HANDLE HWND; //窗口句柄
还有很多其他的句柄类型。
longinus_dean
2012-02-09 · TA获得超过2282个赞
知道小有建树答主
回答量:1097
采纳率:50%
帮助的人:1526万
展开全部
c++中没有所谓句柄类的概念

在windows编程中倒是有一个句柄的概念,类型是HANDLE,这个其实不是一个类,HANDLE在windows其实只是一个类型定义,其内部的类型是数值类型(例如int),这个只是为了唯一标示一个对象/内核对象而已
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
暗影之王01
推荐于2018-04-05 · TA获得超过5.6万个赞
知道大有可为答主
回答量:2万
采纳率:29%
帮助的人:4701万
展开全部
  1. 句柄类(智能指针smart point)是存储指向动态分配(堆)对象指针的类。除了能够在适当的时间自动删除指向的对象外,工作机制很像C++的内置指针。智能指针在面对异常的时候格外有用,因为能够确保正确的销毁动态分配的对象。也可以用于跟踪被多用户共享的动态分配对象。

  2. 在C++中一个通用的技术是定义包装(cover)类或句柄(handle)类,也称智能指针。句柄类存储和管理基类指针。指针所指向对象的类型可以变化,它既可以指向基类类型对象又可以指向派生类型对象。用户通过句柄类访问继承层次的操作。因为句柄类使用指针执行操作,虚成员的行为将在运行时根据句柄实际绑定的对象类型而变化,即实现c++运行时动态绑定。故句柄用户可以获得动态行为但无需操心指针的管理。

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
1140012035
2012-03-21
知道答主
回答量:17
采纳率:0%
帮助的人:18万
展开全部
《c++ 编程思想》第1卷:标准c++导引——第五章:句柄类(handle class),或称为“cheshire cat”。作用主要是用来隐藏接口的实现部分,和减少项目的重新编译。
例子:
class handle_
{
struct cheshire_;
cheshire_* smile;
public:
void initialize();
......
}
在实现部分.cpp 中
struct handle_::cheshire_
{
int i;
}
void handle_::initialize()
{
smile=new cheshire_;
smile->i=0;
}
......
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
鬼斗魔君
2012-02-09 · TA获得超过109个赞
知道答主
回答量:77
采纳率:0%
帮助的人:81.8万
展开全部
和JAVA里的代理概念是一致的,C++使用类的时候必须在头文件中把类声明一遍,这样只要看头文件这个类的所有方法名和成员变量名就都曝光了,极大的损害了封装性质,因此就诞生了句柄了。因为用户是无法查看实现文件的(但是可以查看声明文件)。在头文件里只是声明一个外壳类,而在实现文件中把真正的类和实现写上,在用声明的外壳调用,举例如下:
a.h
class a{//a是外壳类(JAVA中称为代理类,b才是真正要用的类)
class b;
b B;
public :
void name();
};
a.cpp
//---------------句柄类的声明与实现-----------------------
class b{
void nameb();
void c();
void d();
};
void a::b::nameb(){....}
void a::b::c(){....}
void a::b::d(){....}
//-------------------------------------
void a::name(){B.nameb();.....};
如上,可以看出,真正发挥作用的是class b;但是如果检查头文件的话,我们无法知道class b到底有哪些方法有哪些性质,这样就完善了C++的封装性!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式