我需要遍历一个对象向量,并更改它们的变量。但是,当我这样做时,C ++给了我以下错误:
void Projectile::setX(float &)': cannot convert argument 1 from 'float' to 'float &'
initial value of reference to non-const must be an lvalue
我尝试这样做的方法是在for for循环中:
for (Projectile p : activeProjectiles) {
if (p.isLeftPublic) {
float g = p.getX();
p.setX(g - (60));
}
else if (!p.isLeftPublic) {
float g = p.getX();
p.setX(g - (60));
}
}
GetX和SetX函数如下所示:
float Projectile::getX() {
return x;
}
void Projectile::setX(float &_x) {
this->x = _x;
}
任何帮助都将不胜感激。
答案 0 :(得分:10)
首先,没有理由通过引用将float
传递给此函数。它已经很小了。
但如果你真的想要,它应该是const float&
,因为你没有修改它。
实际上,如果您要将临时绑定到它,必须 const float&
,就像在此处一样。
tl; dr: g - (60)
不是变量
然后你需要修复你的循环,它目前根本不会影响activeProjectiles
:
for (Projectile& p : activeProjectiles) {
// ^ important!
答案 1 :(得分:0)
问题的根源是您按值迭代,因此您尝试在循环中修改副本。它应该是:
for (Projectile &p : activeProjectiles) {
您根本不需要void Projectile::setX(float &)
中的引用。看起来你听说要修复你的问题,你需要在某个地方参考,你找到随机的地方把它。你在错误的树上吠叫。
答案 2 :(得分:0)
通常,使用非const
引用的唯一原因是当您打算更改引用的对象时。当然,这样的事情永远不应该发生在setter函数中。如果像setX(my_var);
这样的电话实际修改my_var
,那将是一个很大的惊喜吗?
最佳解决方案是按值传递float
。
如果你将它引用const
,你可以获得引用,因为它符合C ++语言规则,否则会阻止你绑定对未命名的临时对象的引用,例如{{{{{ 1}};然而,这将无所作为,只是看起来很奇怪。通过" big" g - (60)
引用通常用于表现。对象。 const
不是"大"对象
答案 3 :(得分:0)
您正在使用数学表达式调用该函数,如果您的函数不是通过引用,它将起作用。 g-60不是一个变量,你会如何引用它?您需要某种具有地址的变量或对象,以便通过引用传递它。考虑先做g - = 60,然后将g传递给setx,或者像上面提到的那样使用const float&