d-указатели являются одной из многих реализаций шаблона pimpl. Это также одна из первых реализаций: "Название "d-pointer" происходит от имени Арнта Гулбрандсена из Trolltech, который впервые представил эту технику в Qt, сделав ее одной из первых библиотек с графическим интерфейсом C++, поддерживающих двоичную совместимость даже между большими релиз." Источник
Одним из преимуществ использования макросов является возможность изменения некоторых деталей реализации шаблона в центральном месте во время компиляции. Например, вы можете спроектировать свои макросы так, чтобы у вас была возможность переключиться на быструю реализацию pimpl. в более позднее время без изменения тонны кода (надеюсь, вам это не понадобится, если вы используете pimpl :-)). При условии, что вы не допустили ошибок в дизайне/реализации макроса...
Тем не менее, я бы лично рекомендовал избегать макросов для вашей реализации pimpl, поскольку они загадочны для любого новичка в вашем исходном дереве. Макросы создают волшебные диалекты, которые часто подвержены ошибкам и не так значимы, как оригинальный исходный код. Они также имеют все проблемы, связанные с предварительным процессором C; он не знает о базовом языке.
Лично мне нравится использовать то, что я называю d-референсом. Вместо указателя вы используете ссылку, и вам не нужно использовать d-ссылку. 8-) Это выглядит примерно так:
// 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
person
ppl
schedule
04.03.2011