d-punteros son una implementación, entre muchas, del patrón pimpl. También es una de las primeras implementaciones: "El nombre 'd-pointer' proviene de Arnt Gulbrandsen de Trolltech, quien introdujo la técnica por primera vez en Qt, convirtiéndola en una de las primeras bibliotecas de GUI de C++ en mantener la compatibilidad binaria incluso entre versiones más grandes. "Source
Una de las ventajas del uso de macros es la opción de cambiar algunos detalles de implementación de la implementación del patrón en un lugar central en tiempo de compilación. Por ejemplo, podría diseñar sus macros para dejarle la opción de cambiar al fast pimpl implementation en un momento posterior sin cambiar toneladas de código (con suerte no necesitará esto si está utilizando pimpl :-)). Siempre que no haya cometido errores en su diseño/implementación macro ...
Sin embargo, personalmente recomendaría evitar las macros para su implementación de pimpl ya que son crípticas para cualquier recién llegado al árbol fuente. Las macros crean dialectos mágicos que a menudo son propensos a errores y no tan significativos como el código fuente original. También vienen con todos los problemas asociados con el preprocesador C; no tiene conocimiento del lenguaje subyacente.
Personalmente me gusta usar lo que llamo una d-referencia. En lugar de un puntero, usa una referencia y no tiene que hacer una referencia d. 8-) Parece algo como esto:
// MyClass.h
class MyClass
{
public:
MyClass();
~MyClass();
// implementation methods
private:
class MyClassPrivate& d;
};
// MyClass.cpp
struct MyClassPrivate
{
int x;
};
MyClass::MyClass()
: d(*new MyClassPrivate)
{
}
MyClass::~MyClass()
{
delete &d;
}
// In methods use d.x
¿Hay realmente alguna diferencia entre "just pimpl" y d-pointers? Excepto confiar en las macros para automatizar el trabajo. –