【问题标题】:Implementing implicitly shared classes outside of Qt在 Qt 之外实现隐式共享类
【发布时间】:2010-04-12 20:39:25
【问题描述】:

我熟悉 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;
}

我是不是走错了路?

【问题讨论】:

  • 确切的错误是什么?

标签: c++ qt qt4


【解决方案1】:

AFAIK QObjects 不是用来复制的。这就是为什么 QObject 有一个私有 operator= 所以问题是,你为什么要声明一个,如果你这样做了,你的对象是否确实需要是一个 QObject?

【讨论】:

    【解决方案2】:

    Object Model page on the documentation has a section called "Identity vs Value"。

    它提醒了对象在运行时可能已经建立的不同事物,这些事物在编译时不是内在品质(例如动态属性,还有信号和槽与其他对象的连接)。最后提醒一下:

    由于这些原因,Qt 对象应该被视为身份,而不是 价值观。身份被克隆,而不是复制或分配,并且克隆一个 身份是比复制或分配一个更复杂的操作 价值。因此,QObject 和 QObject 的所有子类(直接或 间接)have their copy constructor and assignment operator disabled.

    所以不,你不应该尝试在派生自 QObject 的类中创建隐式共享,不仅因为它会失败,而且因为它可能是一个设计错误。 There are ways to serialize/deserialize a QObject tree,但通常是当您使用对象作为其属性时,例如公开给 QML。另外请注意,Q_GADGET 可以替代不继承自 QObject 并且仍然具有属性(因此可以被复制)。

    也就是说,如果你的类不是从 QObject 派生的,you can use QSharedData and QSharedDataPointer。这些类的目的正是为了创建您自己的隐式共享类。

    【讨论】:

      猜你喜欢
      • 2014-11-09
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多