gpt4 book ai didi

c++ - 为什么 Qt 使用 d_func() 来实例化一个指向私有(private)数据的指针?

转载 作者:可可西里 更新时间:2023-11-01 16:37:39 41 4
gpt4 key购买 nike

考虑以下 Qt 类:

#include <QScopedPointer>

class MyClassPrivate;
class MyClass
{
public:
MyClass();
~MyClass();
private:
QScopedPointer<MyClassPrivate> d_ptr;
Q_DECLARE_PRIVATE(MyClass)
}

这个类类似于大多数实现私有(private)实现的 Qt 类的结构。宏 Q_DECLARE_PRIVATE 将导致以下扩展(从 Qt5 开始):

inline MyClassPrivate* d_func()
{ return reinterpret_cast<MyClassPrivate *>(qGetPtrHelper(d_ptr)); }
inline const MyClassPrivate* d_func() const
{ return reinterpret_cast<const MyClassPrivate *>(qGetPtrHelper(d_ptr)); }
friend class MyClassPrivate;

这很令人困惑 - 为什么 d_ptr 不直接在成员函数中使用?换句话说,而不是这样做:

Q_D(MyClass);
d->member = 12345;

为什么不这样做呢?

d_ptr->member = 12345;

有一个显式函数(基本上)只返回 d_ptr 并导致堆栈上额外变量的开销的原因是什么?

最佳答案

如果派生类和基类各有一个Private结构,会浪费更多的内存,因此Qt中也继承了私有(private)类,派生类和基类共享一个d_ptr。这样做的问题是 d_ptr 现在是 BasePrivate 类型。

class Base
{
protected:
BasePrivate * d_ptr;
}

class Derived
{
// There is not d_ptr declared
}

所以你可以看到,在派生类中,当它访问d_ptr时,类型是BasePrivate*。所以它需要将 d_ptr 转换为 DerivedPrivate*。 d_func 函数是内联的,一旦编译,它总是会将 d_ptr 转换为正确的类型。

This post说明比我在这里说的更好,我建议你阅读它。

关于c++ - 为什么 Qt 使用 d_func() 来实例化一个指向私有(private)数据的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15915189/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com