如何在C++中通过引用传递?

How can I pass by reference in C++?

本文关键字:引用 C++      更新时间:2023-10-16

我需要遍历对象的向量,并更改它们的变量。但是,当我这样做时,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 (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;
}

任何帮助将不胜感激。

首先,确实没有理由通过引用将float传递到此函数中。它已经很小了。

但是,如果你真的想,它应该是一个const float&,因为你没有修改它。

事实上,如果你要像这里一样将一个临时绑定到它,它必须是const float&的。


tl;dr: g - (60)不是变量


然后你需要修复你的循环,它目前根本不影响activeProjectiles

for (Projectile& p : activeProjectiles) {
//             ^ important!

问题的根源是你按值迭代,所以你尝试在循环中修改副本。它应该是:

for (Projectile &p : activeProjectiles) {

您根本不需要void Projectile::setX(float &)参考。看起来您听说要解决您的问题,您需要在某处参考,并且您找到了随机放置它的地方。你在错误的树上吠叫。

通常,使用非const引用的唯一原因是当您打算更改引用的对象时。当然,这样的事情不应该发生在二传手函数中。如果像setX(my_var);这样的电话实际上修改了my_var,那将是一个很大的惊喜,不是吗?

最好的解决方案是按值传递float

如果你让它const,你可以得到引用的工作,因为那样它就会符合C++语言规则,否则它会阻止你绑定一个未命名的临时对象的引用,比如由g - (60)产生的对象;然而,这将一无所获,只是看起来很奇怪。const引用通常用于传递"大"对象时的性能。float不是一个"大"对象。

您正在使用数学表达式调用函数,如果您的函数不是通过引用,该表达式将起作用。 G-60不是一个变量,那么你如何引用它?您需要某种具有地址的变量或对象,以便通过引用传递它。考虑先做 g -= 60,然后将 g 传递到 setx 中,或者像上面提到的使用 const float&