2011-02-13 59 views
9

d-pointers在Qt中被大量使用,它们是pimpl习语的实现。我知道pimpl习语的优点和缺点。但是我错过了d指针实现的优点。 Herehere是d指针的样本。 只是使用这个更简单吗?使用D指针有什么优点和缺点?

class MyClassPrivate; 
class MyClass { 
    // interface methods 
private: 
    MyClassPrivate *pimpl_; 
}; 
+2

“just pimpl”和d-pointers之间真的有区别么?除了依靠宏来自动化工作。 – 2011-02-13 13:30:39

回答

3

d指针模式的宏集提供了一些排序方便性和一致性。例如,Q_DECLARE_PRIVATE可确保Foo的pimpl私有类被命名为FooPrivate,FooPrivate可以与Foo匹配,并创建一个名为d_func()的很好的内联函数(const和nonconst版本)。后者用于Q_D宏,它基本上创建了一个指向私有类实例的作用域/局部变量d。

总之,您不需要使用Q_DECLARE_PRIVATE和其他宏,但这样做会使代码变得更简洁,更清晰并且一致。

0

我认为,d,指针其实只是实现了平普尔成语一些方便的宏。只需看看所有这些宏的定义:Q_D,Q_Q,Q_DECLARE_PRIVATE等。它们只是pimpl部分的快捷方式。例如,大多数时候你想保留私人类中的原始类的引用。这里有Q_QQ_DECLARE_PUBLIC。毕竟,使用宏迫使所有团队实现统一的pimpl。否则有些人会打电话给私人指针d,其他pimpl_,想象一下这个烂摊子。

13

d指针是pimpl模式中的一个实现,其中有很多。它也是早期的实现之一:“”d-pointer“这个名字来自Trolltech的Arnt Gulbrandsen,他首先将这项技术引入到Qt中,使其成为第一个C++ GUI库,即使在更大版本之间也能保持二进制兼容性。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 
+0

很好,谢谢:) – 2016-07-12 02:35:35

相关问题