是否有一个智能指针使用复制构造函数和赋值运算符复制对象?

时间:2017-10-31 08:36:36

标签: c++ qt smart-pointers

在Qt中,大多数类通常都有一个公共包装类,它有一个指向私有类的指针。这是为了二进制兼容性。

https://wiki.qt.io/D-Pointer

然而,这意味着有许多事情需要手工实施。有人建议使用QScopedPointer。

How to use the Qt's PIMPL idiom?

但是,这也没有实现复制和分配。是不是有一个智能指针,它只会在复制时复制指针的内容。从本质上讲,它应该表现得好像私有类中的数据属于公共类。

3 个答案:

答案 0 :(得分:3)

Qt提供了一个专门用于此目的的课程:QSharedDataPointer

QSharedData一起使用,它提供了一种快速方法来实现具有隐式共享数据的类并复制写入行为。

您还可以与QExplicitlySharedDataPointer明确分享。

class MyData : public QSharedData
{
  public:
    MyData (){ }
    MyData (const MyData &other)
        : QSharedData(other), a(other.a), b(other.b) { }
    ~MyData () { }

    int a;
    QString b;
};

class MyClass
{
  public:
    MyClass() { d = new MyData; }
    MyClass(const MyClass&other)
          : d (other.d)
    {
    }
    void setA(int a) { d->a = a; } // the function is non const, so accessing d->a will make a copy of MyData if d is shared with another instance (CoW)
    int a() const { return d->a; }

  private:
    QSharedDataPointer<MyData> d;
};

答案 1 :(得分:1)

QScopePointer相当于std :: unique_ptr,它是一个具有唯一所有权的指针,这意味着它无法复制。

通常,您执行的是在实现外观的复制操作时ScopedPointer指向的内容的深层副本。

另一个解决方案是使用共享指针(QSharedPointer)实现pimpl;但这意味着从另一个复制的立面将指向相同的pimpl。在一些可能相关的情况下。

答案 2 :(得分:-1)

在Qt中,您不需要经常支持复制和分配。

许多类都是从QObject继承而来的,这种继承禁止复制和赋值。