Каковы плюсы и минусы использования d-указателей? - PullRequest
10 голосов
/ 13 февраля 2011

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

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

Ответы [ 3 ]

14 голосов
/ 04 марта 2011

d-указатели являются одной из многих реализаций шаблона pimpl.Это также одна из ранних реализаций: « Название« d-pointer »происходит от Арнта Гулбрандсена из Trolltech, который впервые представил эту технику в Qt, сделав ее одной из первых библиотек C ++ с графическим интерфейсом, поддерживающей двоичную совместимость даже между большимиrelease." Source

Одним из преимуществ использования макросов является возможность изменения некоторых деталей реализации шаблона в центральном месте во время компиляции.Например, вы могли бы спроектировать свои макросы, чтобы оставить возможность позже перейти к реализации fast pimpl без изменения тонны кода (надеюсь, вам это не понадобится, если вы используете pimpl :-)).При условии, что вы не допустили ошибок в дизайне / реализации макроса ...

Однако я лично рекомендовал бы избегать макросов для вашей реализации pimpl, поскольку они загадочны для любого новичка в вашем исходном дереве.Макросы создают магические диалекты, которые часто подвержены ошибкам и не так значимы, как исходный код.Они также поставляются со всеми проблемами, связанными с процессором C Pre;он не знает базового языка.

Лично мне нравится использовать то, что я называю 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
4 голосов
/ 21 февраля 2011

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

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

0 голосов
/ 14 февраля 2011

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

...