【发布时间】:2011-05-30 09:03:48
【问题描述】:
Microsoft 的GDI+ 定义了许多在内部被视为句柄的空类。例如,(来源GdiPlusGpStubs.h)
//Approach 1
class GpGraphics {};
class GpBrush {};
class GpTexture : public GpBrush {};
class GpSolidFill : public GpBrush {};
class GpLineGradient : public GpBrush {};
class GpPathGradient : public GpBrush {};
class GpHatch : public GpBrush {};
class GpPen {};
class GpCustomLineCap {};
还有另外两种定义句柄的方法。他们是,
//Approach 2
class BOOK; //no need to define it!
typedef BOOK *PBOOK;
typedef PBOOK HBOOK; //handle to be used internally
//Approach 3
typedef void* PVOID;
typedef PVOID HBOOK; //handle to be used internally
我只想知道这些方法的优缺点。
Microsoft 方法的一个优点是,他们可以使用空类定义 类型安全 句柄层次结构,这(我认为)其他两个类是不可能的方法,尽管我想知道这种层次结构会给实施带来什么好处?无论如何,还有什么?
编辑:
第二种方法(即使用不完整的类)的一个优点是我们可以防止客户端取消引用句柄(这意味着,这种方法似乎强烈支持封装,我想)。如果尝试取消引用句柄,代码甚至无法编译。还有什么?
第三种方法也有同样的优势,即不能取消引用句柄。
【问题讨论】:
-
此处相关(不完全相同)问题:stackoverflow.com/q/839765/50079。不幸的是,没有什么可以从中收集到的。
-
标签: c++ handles incomplete-type empty-class