D-指针在Qt中被大量使用,它们是pimpl惯用法的一种实现。我知道pimpl成语的优点和缺点。但是我错过了d-pointers实现的优点。Here和here是d指针的示例。仅仅使用这个不是更简单吗?
class MyClassPrivate;
class MyClass {
// interface methods
private:
MyClassPrivate *pimpl_;
};发布于 2011-02-21 13:14:32
D指针模式的宏集提供了某种排序的便利性和一致性。例如,Q_DECLARE_PRIVATE确保Foo的pimpl私有类被命名为FooPrivate,FooPrivate与Foo成为好友,并创建了一个名为d_func()的很好的内联函数(常量和非常量版本)。后者用在Q_D宏中,它基本上创建了一个作用域/局部变量d,该变量指向私有类实例。
简而言之,您不需要使用Q_DECLARE_PRIVATE和其他宏,但这样做会使代码更短、更整洁和一致。
发布于 2011-03-04 12:21:14
D指针是pimpl模式的众多实现之一。它也是最早的实现之一:“'d-pointer‘这个名字源于Trolltech的Arnt Gulbrandsen,他首先将这项技术引入Qt,使其成为首批即使在更大版本之间也能保持二进制兼容性的C++图形用户界面库之一。”Source
使用宏的一个优点是可以在编译时在中央位置更改模式实现的一些实现细节。例如,你可以设计你的宏,让你可以选择在以后切换到fast pimpl implementation,而不需要修改大量的代码(如果你使用的是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发布于 2011-02-14 08:37:28
我认为d-pointers实际上只是实现pimpl习惯用法的几个方便的宏。只需看看所有这些宏的定义:Q_D、Q_Q、Q_DECLARE_PRIVATE等,它们只是部分pimpl的快捷方式。例如,大多数情况下,您希望在私有类中保留对原始类的引用。这方面有Q_Q和Q_DECLARE_PUBLIC两种。毕竟,使用宏会强制所有团队都有一个统一的pimpl实现。否则,一些人会称私有指针为d,另一些人称其为pimpl_,想象一下这种混乱。
https://stackoverflow.com/questions/4983972
复制相似问题