gpt4 book ai didi

从 QObject 继承 QT pimpl

转载 作者:行者123 更新时间:2023-12-01 01:28:01 27 4
gpt4 key购买 nike

在浏览 Qt 代码时,我有一个关于 pimpl 实现的基本问题。
以 QWidget 实现为例。

QWidget        ---inherits---> QObject
| |
contains contains
| |
\ / \ /
QWidgetPrivate ---inherits---> QObjectPrivate

现在 QWidget 有两个 QObjectPrivate 实例(通过继承和通过包含)。
为什么以这种方式执行?拥有同一个对象的两个实例不是开销吗?

最佳答案

没有 QObjectPrivate 的两个实例实例化 QWidget 时.如果你仔细查看 QObject 的头文件,你会注意到一个 protected 构造函数:

protected:
QObject(QObjectPrivate &dd, QObject *parent = 0);

它将 QObjectPrivate 的实例设置为通过 protected 构造函数传入的实例:
QObject::QObject(QObjectPrivate &dd, QObject *parent)
: d_ptr(&dd)

这是所有不同 QWidget 调用的构造函数构造器。 QWidget 构造函数传入 QWidgetPrivate 的实例正如您所指出的,它是 QObjectPrivate 的子类.因此,QWidget 中只存在一个 QObjectPrivate 实例。

这是默认的 QWidget说明这一点的构造函数:
QWidget::QWidget(QWidget *parent, Qt::WindowFlags f)
: QObject(*new QWidgetPrivate, 0), QPaintDevice()
{
QT_TRY {
d_func()->init(parent, f);
} QT_CATCH(...) {
QWidgetExceptionCleaner::cleanup(this, d_func());
QT_RETHROW;
}
}

关于从 QObject 继承 QT pimpl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6513629/

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