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