c++ - 使用 d 指针的优点和缺点是什么?

标签 c++ qt pimpl-idiom

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

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

最佳答案

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

关于c++ - 使用 d 指针的优点和缺点是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4983972/

相关文章:

C++ QT 内存分配

没有malloc的完全封装

c++ - 有没有办法让 for_each 引用?

即使在堆上,C++ 程序也会因数组过大而崩溃

c++ - 新窗口中的 QProgressBar 不起作用

c++ - Qt 5.7 如何在运行时检查变量 QT_QPA_PLATFORM 的值?

c++ - 创建一个指向包含字符串的新类的指针

c++ - 如何获取 C++ 中抽象(?)pimpl 的调试信息?

C++ - 范围和字符

python - 是否可以将Visual Studio混合模式调试附加到Jupyter笔记本上以同时调试C++和Python?