d指针在Qt中大量使用,它们是pimpl习语的实现。我知道pimpl成语的优点和缺点。但我错过了d-pointers实现的优点。 Here和here是d指针的示例。 使用它不是更容易吗?
class MyClassPrivate;
class MyClass {
// interface methods
private:
MyClassPrivate *pimpl_;
};
答案 0 :(得分:14)
d指针是pimpl模式中的一种实现。它也是早期实现之一:“名称'd-pointer'源自Trolltech的Arnt Gulbrandsen,他首先将该技术引入Qt,使其成为第一个保持二进制兼容性的C ++ GUI库之一,甚至更大发布。“Source
使用宏的一个优点是可以在编译时在中心位置更改模式实现的某些实现细节。例如,您可以设计您的宏,让您可以选择在以后切换到fast pimpl implementation而无需更改大量代码(如果您使用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
答案 1 :(得分:4)
d指针模式的宏集提供了一些排序方便性和一致性。例如,Q_DECLARE_PRIVATE确保Foo的pimpl私有类被命名为FooPrivate,FooPrivate与Foo成为朋友,并创建一个名为d_func()的漂亮的内联函数(const和nonconst版本)。后者用于Q_D宏,它基本上创建了一个指向私有类实例的作用域/局部变量。
简而言之,您不需要使用Q_DECLARE_PRIVATE和其他宏,但这样做会使代码更短,更清晰,更一致。
答案 2 :(得分:0)
我认为d-pointers实际上只是用于实现 pimpl 习语的几个方便的宏。只需看看所有这些宏的定义:Q_D
,Q_Q
,Q_DECLARE_PRIVATE
等。它们只是 pimpl 部分的快捷方式。例如,大多数情况下,您希望在私有类中保留对原始类的引用。这有Q_Q
和Q_DECLARE_PUBLIC
。毕竟,使用宏会强制所有团队统一实现 pimpl 。否则,有些人会调用私人指针d
,其他人pimpl_
,想象这个混乱。