存储在 QVector 中的结构的状态变化
Posted
技术标签:
【中文标题】存储在 QVector 中的结构的状态变化【英文标题】:Change in the state of a struct stored in a QVector 【发布时间】:2013-11-16 12:20:09 【问题描述】:我不明白这部分代码有什么问题:
struct aliance
...
void setFirstTeam(const team& _team)
firstTeam = _team;
void setSecondTeam(const team& _team)
secondTeam = _team;
QVector< aliance > _aliances;
...
_aliances.at(i).setFirstTeam(firstAlianceTeam);
_aliances.at(i).setSecondTeam(secondAlianceTeam);
我收到错误:
passing 'const aliance' as 'this' argument of 'void aliance::setFirstTeam(const team&)' discards qualifiers [-fpermissive]
passing 'const aliance' as 'this' argument of 'void aliance::setSecondTeam(const team&)' discards qualifiers [-fpermissive]
我已经用const
至少重试了这两个函数的所有变体,而没有一个。
【问题讨论】:
【参考方案1】:QVector<T>::at()
返回一个const T&
,这意味着您不能对结果调用非常量成员函数(例如您的setFirstTeam()
函数)。为什么 Qt 不提供非常量重载 beyond me 与 Qt 的容器写入时复制语义有关(感谢 @peppe 指出这一点)。它确实为operator[]
提供了两个重载,所以你应该这样做:
_aliances[i].setFirstTeam(firstAlianceTeam);
【讨论】:
因为at
旨在避免分离,并且很明显您没有接触容器的内容。 operator[]
有 const 重载。换句话说:vector.at(i).constMethod()
如果向量未声明为 const,则将花费向量的完整副本。
@peppe 哦,对。我忘记了 Qt 的容器写时复制语义。以上是关于存储在 QVector 中的结构的状态变化的主要内容,如果未能解决你的问题,请参考以下文章
访问存储在 QVector 中的 QObject 的各个方面
如何将 QVector<T> 的地址动态存储在另一个 QVector<QVector<T>*> 中?
QList介绍(QList比QVector更快,这是由它们在内存中的存储方式决定的。QStringList是在QList的基础上针对字符串提供额外的函数。at()操作比操作符[]更快,因为它不需要深度