Каковы плюсы и минусы использования d-указателей?

d-указатели широко используются в Qt, они являются реализацией идиомы pimpl. Я знаю преимущества и недостатки идиомы pimpl. Но я упустил преимущества реализации d-указателей. Здесь и здесь приведены примеры d-указателей. Не проще ли просто использовать это?

class MyClassPrivate;
class MyClass {
  // interface methods
private:
  MyClassPrivate *pimpl_;
};

person Dmitriy    schedule 13.02.2011    source источник
comment
Есть ли действительно какие-либо различия между просто pimpl и d-указателями? За исключением использования макросов для автоматизации работы.   -  person Sergei Tachenov    schedule 13.02.2011


Ответы (3)


Набор макросов для шаблона d-указателя обеспечивает некоторое удобство и согласованность. Например, Q_DECLARE_PRIVATE гарантирует, что частный класс pimpl для Foo будет называться FooPrivate, что FooPrivate подружится с Foo, и создаст хорошую встроенную функцию (как константную, так и неконстантную версии) с именем d_func(). Последний используется в макросе Q_D, который в основном создает переменную с ограниченной областью/локальную переменную d, которая указывает на частный экземпляр класса.

Короче говоря, вам не нужно использовать Q_DECLARE_PRIVATE и другие макросы, но это сделает код короче, чище и согласованнее.

person Ariya Hidayat    schedule 21.02.2011

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
comment
первая ссылка 404 - person 463035818_is_not_a_number; 23.10.2019

Я думаю, что d-указатели — это всего лишь несколько удобных макросов для реализации идиомы pimpl. Просто взгляните на определение всех этих макросов: Q_D, Q_Q, Q_DECLARE_PRIVATE и т. д. Это просто ярлыки для частей pimpl. Например, в большинстве случаев вы хотите сохранить ссылку на исходный класс в частном классе. Для этого есть Q_Q и Q_DECLARE_PUBLIC. В конце концов, использование макросов заставляет всю команду иметь единую реализацию pimpl. Иначе некоторые люди назвали бы приватный указатель d, другие pimpl_, представьте себе этот бардак.

person ak.    schedule 14.02.2011