Qt相当于boost :: ptr_vector?

sas*_*alm 6 c++ qt qtcore qscopedpointer qsharedpointer

我需要一个指针容器来取得指针的所有权 - 即当一个元素被删除,或者容器超出范围时,它释放所有指针,就像在boost::ptr_vector.

QList<QScopedPointer<AbstractClass> > 不起作用(编译错误,没有复制构造函数?).

现在我正在使用QList<QSharedPointer<AbstractClass> >,但感觉就像一个矫枉过正,它的引用计数和多线程的昂贵的互斥量.

编辑:我刚刚了解了QPtrList(感谢@ForEveR),它在Qt3中非常相同,但是从更高版本中删除了.我只是不明白为什么他们会删除它.

lpa*_*app 4

你是对的,由于上述原因,QSharedPointer 是有点开销。

不幸的是,Qt 中没有这样的指针向量,并且当语言发展并且我们已经有了很好的原语来完成类似的工作时是否值得添加它也有点值得怀疑。

我刚刚与一位 Qt 核心开发人员进行了快速讨论,今天推荐的解决方案似乎是 QSharedPointer 或来自 C++11 的解决方案:

std::vector<std::unique_ptr<AbstractClass>>
Run Code Online (Sandbox Code Playgroud)

不要尝试使用 QVector 而不是 std::vector,因为 QVector 可能想要进行复制。

即使在 C++11 中,也不要尝试此解决方案:

QList<QScopedPointer<AbstractClass>>
Run Code Online (Sandbox Code Playgroud)

这里的问题是 QList 想要进行复制。当使用任何非常量方法时,将调用 detach 来制作副本,但不会编译器。

此外,QScopedPointer 没有移动构造函数或运算符,这是设计使然