d 指针在 Qt 中被大量使用,它们是 pimpl idiom 的实现。我知道 pimpl idiom 的优点和缺点。但是我错过了 d-pointers 实现的优势。这里和这里是 d 指针的示例。使用它不是更容易吗?
class MyClassPrivate;
class MyClass {
// interface methods
private:
MyClassPrivate *pimpl_;
};
d 指针是 pimpl 模式的众多实现之一。它也是早期的实现之一:“ 'd-pointer' 这个名字源于奇趣科技的 Arnt Gulbrandsen,他首先将该技术引入 Qt,使其成为第一个即使在更大的版本之间也能保持二进制兼容性的 C++ GUI 库之一。 ”资源
使用宏的一个优点是可以在编译时在一个中心位置更改模式实现的一些实现细节。例如,您可以设计宏,让您可以选择稍后切换到快速 pimpl 实现,而无需更改大量代码(希望您在使用 pimpl 时不需要这个 :-))。前提是您在宏设计/实现中没有犯错...
但是,我个人建议在您的 pimpl 实现中避免使用宏,因为它们对于您的源代码树的任何新手来说都是神秘的。宏创建了神奇的方言,这些方言通常容易出错,并且不如原始源代码有意义。它们还带有与 C 预处理器相关的所有问题;它不知道底层语言。
就我个人而言,我喜欢使用我称之为 d-reference 的东西。您使用引用而不是指针,而不必使用 d-reference。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
d-pointer 模式的宏集提供了某种便利性和一致性。例如,Q_DECLARE_PRIVATE 确保 Foo 的 pimpl 私有类被命名为 FooPrivate,FooPrivate 与 Foo 成为朋友,并创建了一个名为 d_func() 的漂亮内联函数(const 和 nonconst 版本)。后者用于 Q_D 宏,它基本上创建了一个指向私有类实例的作用域/局部变量 d。
简而言之,您不需要使用 Q_DECLARE_PRIVATE 和其他宏,但这样做会使代码更短、更清晰、更一致。
我认为 d 指针实际上只是用于实现pimpl习语的几个方便的宏。看看所有这些宏的定义:Q_D
, Q_Q
,Q_DECLARE_PRIVATE
等。它们只是pimpl部分的快捷方式。例如,大多数时候您希望在私有类中保留对原始类的引用。有Q_Q
和Q_DECLARE_PUBLIC
为此。毕竟,使用宏会迫使所有团队统一实现pimpl。否则有些人会调用私有指针d
,而另一些人则pimpl_
想象一下这个烂摊子。