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 заключается в том, что они могут определять типобезопасную иерархию дескрипторов ] с использованием пустых классов, что (я думаю) невозможно с двумя другими подходами, хотя мне интересно, какие преимущества эта иерархия принесет реализации? В любом случае, что еще?
РЕДАКТИРОВАТЬ:
Одно из преимуществ второго подхода (т. Е. С использованием неполных классов) заключается в том, что мы можем предотвратить разыменование дескрипторов клиентами (что означает, я полагаю, этот подход сильно поддерживает инкапсуляцию). Код даже не будет компилироваться, если кто-то попытается разыменовать дескрипторы. Что еще?
То же преимущество, что и при третьем подходе, в том, что вы не можете разыменовать ручки.