c++ - Qt 相当于 boost::ptr_vector?

标签 c++ qt qtcore qsharedpointer qscopedpointer

我需要一个拥有指针所有权的指针容器——即当一个元素被删除,或者容器超出范围时,它会释放所有指针,就像在 boost::ptr_vector 中一样。 .

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

现在我正在使用 QList<QSharedPointer<AbstractClass> > ,但它的引用计数和用于多线程的昂贵互斥体感觉有点矫枉过正。

编辑:我刚刚了解到 QPtrList (感谢@ForEveR)这在 Qt3 中非常等效,但已从更高版本中删除。我只是不明白他们为什么要删除它。

最佳答案

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

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

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

std::vector<std::unique_ptr<AbstractClass>>

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

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

QList<QScopedPointer<AbstractClass>>

这里的问题是 QList 想要复制。当使用任何非常量方法时,将调用 detach,它会生成拷贝,但不会编译。

此外,QScopedPointer 没有移动构造函数或运算符,并且 that is by design .

关于c++ - Qt 相当于 boost::ptr_vector?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27523167/

相关文章:

c++ - 在 C++ 中查找值集合的中位数

qt - QGLWidget的paintGL什么时候被调用?

c++ - 在 Qt 中使用排队连接时如何压缩插槽调用?

C++ 代码风格 - 创建对象的最佳位置

c++ - 快速而肮脏的方式来分析你的代码

c++ - 如何安全地停止 IOCP WSARecv() 任务,并释放 WSAOVERLAPPED 结构?

.net - Qt Creator + .NET 框架

qt - 使用Jenkins xUnit插件显示QTeSTLib的结果

c++ - 如何在 Qt 中使用 QJson 库

c++ - 在 Qt 信号中发射 QVector 引用导致复制