gpt4 book ai didi

c++ - 我可以在继承自 QObject 的同时使用 QSharedData 吗?

转载 作者:太空狗 更新时间:2023-10-29 22:53:19 28 4
gpt4 key购买 nike

如何在 Qt 中隐藏私有(private)实现(隐式共享):

我的 Employee.h header 中有 Employee.cpp:

#include <QSharedData>
#include <QString>


class EmployeeData;
class Employee: public QObject
{
Q_OBJECT
public:
Employee();
Employee(int id, QString name);
Employee(const Employee &other);
void setId(int id);
void setName(QString name);

int id();
QString name();

private:
QSharedDataPointer<EmployeeData> d;
};

class EmployeeData : public QSharedData
{
public:
EmployeeData() : id(-1) { name.clear(); }
EmployeeData(const EmployeeData &other)
: QSharedData(other), id(other.id), name(other.name) { }
~EmployeeData() { }

int id;
QString name;
};

但是当我将 EmployeeData 移动到私有(private)部分时,比如 Employee.cpp 我得到: 错误:不完整类型“struct EmployeeData”的无效使用

但是,如果我将我的定义更改为这样它就可以正常工作:

class Employee
{
public:
Employee();
Employee(int id, QString name);
..

那么,我可以在继承自 QObject 的同时使用 QSharedData 吗?

最佳答案

Thus, can I use QSharedData while inheriting from QObject ?

使用 QSharedData 时不能从 QObject 继承。 QSharedData 使用 copy-on-write语义并将调用detach()在数据不再共享时创建数据拷贝。为了进行复制,需要一个复制构造函数,QObject 不支持。

pimpl (或 handle-body/opaque-pointer 习语)通常会为数据类提供对公共(public)实现的引用,这就是您使用信号和槽的方式。

QSharedDataPointer提供了大部分的实现细节,但是看一下 Qt 中使用的 pimpl 习语也很有启发性 (see Q_D and friends)

关于c++ - 我可以在继承自 QObject 的同时使用 QSharedData 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2602724/

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