【发布时间】:2020-05-10 22:46:32
【问题描述】:
我有一个包含 Enemy 对象的向量,称为 enemiesOnField。当调用一个可能会改变单个敌人坐标的函数 takeYourTurn 时,我注意到即使改变发生在函数内,它也不会持续存在于 enemiesOnField 向量中。这使我相信,当通过迭代器调用此函数时,它以某种方式在副本上调用,而不是在原始对象上调用。当通过 [] 运算符返回的引用调用时,一切正常。
没有按预期工作的代码被注释掉:
void World::letNPCsAct()
{
/* this doesn't work
for (auto it : enemiesOnField)
it.takeYourTurn();*/
// this works
for (int i = 0; i < enemiesOnField.size(); ++i)
enemiesOnField[i].takeYourTurn();
}
为什么会这样??
【问题讨论】:
-
基于范围的循环会修改原始对象的 副本。您需要循环引用来修改原始向量。
-
类似于:for (const auto& it :enemyOnField) it.takeYourTurn();行得通吗?
标签: c++