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 {};
ハンドルを定義するには、他に 2 つの方法があります。彼らは、
//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 のアプローチの利点の 1 つは、空のクラスを使用してハンドルのタイプ セーフな 階層を定義できることです。これは (私が思うに) 他の 2 つのアプローチでは不可能ですが、この階層が実装にどのような利点をもたらすのでしょうか? とにかく、他に何?
編集:
2 番目のアプローチ (つまり、不完全なクラスを使用する) の利点の 1 つは、クライアントがハンドルを逆参照するのを防ぐことができることです (つまり、このアプローチはカプセル化を強力にサポートしているように見えます)。ハンドルを逆参照しようとすると、コードはコンパイルされません。ほかに何か?
ハンドルを逆参照できないという 3 番目のアプローチにも同じ利点があります。