Comparação de alças: classes vazias vs. classes indefinidas vs.
Da MicrosoftGDI + define muitas classes vazias a serem tratadas como identificadores internamente. Por exemplo, (fonteGdiPlusGpStubs.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 {};
Existem outras duas maneiras de definir identificadores. Eles estão,
//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
Eu só quero saber as vantagens e desvantagens de cada uma dessas abordagens.
Uma vantagem da abordagem da Microsoft é que eles podem definirseguro hierarquia de alças usando classes vazias, o que (eu acho) não é possível com as outras duas abordagens, apesar de eu me perguntar quais vantagens essa hierarquia traria para a implementação? Enfim, o que mais?
EDITAR:
Uma vantagem da segunda abordagem (ou seja, o uso de classes incompletas) é que podemos impedir que os clientes desreferenciem os identificadores (ou seja, essa abordagem parece suportar fortemente o encapsulamento, suponho). O código nem seria compilado se alguém tentasse desreferenciar identificadores. O quê mais?
A mesma vantagem que se tem com a terceira abordagem também, é que você não pode desreferenciar as alças.