d指针是pimpl模式的一种实现方法之一。它也是早期的实现之一:"'d-pointer'这个名字来源于Trolltech的Arnt Gulbrandsen,他首次将该技术引入Qt中,使其成为可在更大版本之间保持二进制兼容性的第一个C++ GUI库之一。"来源
使用宏的一个优点是可以在编译时的一个中心位置更改某些模式实现的细节。例如,你可以设计你的宏以使你在不改变大量代码的情况下有选择地切换到快速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的好友,并创建一个漂亮的内联函数(包括const和nonconst版本)称为d_func()。后者在Q_D宏中使用,该宏基本上创建了一个指向私有类实例的作用域/局部变量d。
简而言之,您不需要使用Q_DECLARE_PRIVATE和其他宏,但这样做将使代码更短,更清洁,更一致。
我认为d-pointers实际上只是一些方便的宏,用于实现pimpl惯用法。只需看一下所有这些宏的定义:Q_D
、Q_Q
、Q_DECLARE_PRIVATE
等等。它们只是pimpl的部分快捷方式。例如,大多数情况下,您希望在私有类中保留对原始类的引用。这就是Q_Q
和Q_DECLARE_PUBLIC
的作用。毕竟,使用宏强制整个团队采用统一的pimpl实现。否则,有些人会将私有指针称为d
,而其他人则称为pimpl_
,想象一下这种混乱。