使用d指针的优点和缺点是什么?

Dmi*_*riy 11 c++ qt pimpl-idiom

d指针在Qt中大量使用,它们是pimpl习语的实现.我知道pimpl成语的优点和缺点.但我错过了d-pointers实现的优点.这里这里是d指针的样本.使用它不是更容易吗?

class MyClassPrivate;
class MyClass {
  // interface methods
private:
  MyClassPrivate *pimpl_;
};
Run Code Online (Sandbox Code Playgroud)

ppl*_*ppl 15

d指针是许多pimpl模式中的一种实现.它也是早期实现之一:" 名称'd-pointer'源自Trolltech的Arnt Gulbrandsen,他首先将该技术引入Qt,使其成为第一个保持二进制兼容性的C++ GUI库之一,即使在更大版本之间也是如此. " 资源

使用宏的一个优点是可以在编译时在中心位置更改模式实现的某些实现细节.例如,您可以设计您的宏,让您可以选择在以后切换到快速pimpl实现,而无需更改大量代码(如果您使用pimpl :-),希望您不需要这样做).只要您在宏设计/实现中没有犯错......

但是,我个人建议为你的pimpl实现避免使用宏,因为它们对你的源代码树的任何新手来说都是神秘的.宏创建了神奇的方言,这些方言通常容易出错并且没有原始源代码那么有意义.它们还带有与C预处理器相关的所有问题; 它不知道底层语言.

我个人喜欢使用我称之为d-reference的东西.您使用引用而不是指针,而不必使用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
Run Code Online (Sandbox Code Playgroud)


Ari*_*yat 4

d 指针模式的宏集提供了某种排序便利性和一致性。例如,Q_DECLARE_PRIVATE 确保 Foo 的 pimpl 私有类被命名为 FooPrivate,FooPrivate 与 Foo 成为朋友,并创建一个名为 d_func() 的漂亮内联函数(const 和非常量版本)。后者用于 Q_D 宏,它基本上创建一个指向私有类实例的作用域/局部变量 d 。

简而言之,您不需要使用 Q_DECLARE_PRIVATE 和其他宏,但这样做会使代码更短、更清晰且一致。