微软的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的方法之一的优点是,他们可以使用空类定义类型安全的handles层次结构,这(我认为)其他两种方法不可能做到,尽管我想知道这个层次结构会给实现带来什么好处?还有呢?
编辑:
第二种方法(即使用不完整的类)的一个优点是,我们可以防止客户端对句柄进行解除引用(也就是说,这种方法似乎强烈支持封装性)。如果试图对句柄进行解除引用,代码甚至都不会编译。还有呢?
第三种方法也具有相同的优点,您无法对句柄进行解除引用。