在 QVector 插入函数后无法访问的点

Posted

技术标签:

【中文标题】在 QVector 插入函数后无法访问的点【英文标题】:points not accessible after QVector insert function 【发布时间】:2017-09-07 15:35:31 【问题描述】:

我正在尝试关注rule of three,但是这样做会导致 QVector 的插入功能出现问题。

添加复制构造函数和析构函数后,我的程序将产生一个点向量不再可访问的错误,因此复制构造函数无法重新分配点。

这是我的代码中的一些 sn-ps

QVector<QPointF> *mList = nullptr;
int area;

Shape::Shape()

    mList = new QVector<QPointF>();
    area = 0;

Shape::Shape(const Shape &obj)

    mList = new QVector<QPointF>();
    mList = *obj.mList;
    area = obj.area;

Shape::~Shape()

    delete mList;

现在我使用 qSort 按面积对一组“形状”对象进行排序,qSort 使用 QVector 函数。

void T::sortByArea()
     
    qSort(listOfShapes);

当这个方法结束时。我发现其中一个形状现在有一个值为&lt;not accessible&gt; 的mList。只有在使用 QVector::insert(int i, const T &value) 时才会出现在排序中。


到目前为止,此形状列表已被编辑和操作,但这是迄今为止唯一一次无法访问形状列表。原因是什么?我应该如何解决这个问题?

【问题讨论】:

【参考方案1】:

据我所知,由于您在复制构造函数参数列表中使用了const,因此 QVector 只是浅复制而不是深复制。这是因为 QVector 是一个implicitly shared container。

删除const 应该可行,但更好的解决方案可能是显式复制整个向量(例如使用memcopy),而不仅仅是使用QVector 的= 运算符。

【讨论】:

以上是关于在 QVector 插入函数后无法访问的点的主要内容,如果未能解决你的问题,请参考以下文章

调用函数后无法访问数组

从Azure获取令牌以访问Microsoft Graph后无法调用函数

Win10插入U盘后双击无法打开,无法访问,显示设备未就绪;驱动哥帮你解决

qvector倒序插入

访问存储在 QVector 中的 QObject 的各个方面

ORACLE 无法访问表空间