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
我只想知道每种方法的优缺点。
微软方法的一个优点是,他们可以使用空类定义句柄的类型安全 层次结构,这(我认为)在其他两种方法中是不可能的,尽管我想知道这种层次结构会给实现带来什么好处?无论如何,还有什么?
编辑:
第二种方法(即使用不完整的类)的一个优点是我们可以防止客户端取消引用句柄(这意味着,这种方法似乎强烈支持封装,我想)。如果尝试取消引用句柄,代码甚至无法编译。还有什么?
第三种方法也具有相同的优势,即您不能取消引用句柄。