Сравнение дескрипторов: пустые классы vs. undefined классы против void *

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 заключается в том, что они могут определять типобезопасную иерархию дескрипторов ] с использованием пустых классов, что (я думаю) невозможно с двумя другими подходами, хотя мне интересно, какие преимущества эта иерархия принесет реализации? В любом случае, что еще?

РЕДАКТИРОВАТЬ:

Одно из преимуществ второго подхода (т. Е. С использованием неполных классов) заключается в том, что мы можем предотвратить разыменование дескрипторов клиентами (что означает, я полагаю, этот подход сильно поддерживает инкапсуляцию). Код даже не будет компилироваться, если кто-то попытается разыменовать дескрипторы. Что еще?

То же преимущество, что и при третьем подходе, в том, что вы не можете разыменовать ручки.

10
задан Nawaz 25 December 2010 в 05:21
поделиться