在Qt之外实现隐式共享类

4
我熟悉Qt使用D指针管理数据的方式。我该如何在我的代码中实现这一点?
我尝试了以下方法:
1)将所有数据移动到一个结构体中 2)向结构体添加QAtomicInt 3)实现一个=运算符,并更改我的构造函数/析构函数以检查引用计数。
问题是,当我尝试浅复制对象时,我会收到关于QObject声明=为私有的错误。那么我该如何完成这个操作呢?
以下是我的复制运算符示例:
HttpRequest & HttpRequest::operator=(const HttpRequest &other)
{
    other.d->ref.ref();
    if (!d->ref.deref())
        delete d;
    d = other.d;
    return *this;
}

我这样做是错的吗?


什么是确切的错误? - shoosh
2个回答

0
据我所知,QObjects 不应该被随意复制。这就是为什么 QObject 有一个私有 operator= 的原因,所以问题是,为什么你想要声明一个,如果你确实需要一个,你的对象是否确实需要成为 QObject?

0

文档中的对象模型页面有一个名为“Identity vs Value”的部分。

它提醒我们,对象在运行时可能具有不同的东西,并且这些东西不是编译时固有的特性(例如动态属性,以及与其他对象连接的信号和插槽)。最终提醒:

出于这些原因,Qt对象应被视为身份而非值。身份被克隆,而不是复制或分配,克隆身份比复制或分配值更复杂。因此,QObject和QObject的所有子类(直接或间接)都禁用了它们的复制构造函数和赋值运算符

所以,不应该尝试在从QObject派生的类中创建隐式共享,不仅因为它会失败,而且因为这很可能是一个设计错误。有一些方法可以序列化/反序列化QObject树,但通常是当您使用对象的属性时,例如将其暴露给QML。此外,请注意Q_GADGET可以是不继承QObject并仍具有属性(因此可以复制)的替代方法。

话虽如此,如果您的类没有从QObject派生,您可以使用QSharedData和QSharedDataPointer。这些类正是为了创建自己的隐式共享类而设计的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接