如何在 C++ 中通过引用传递?
How can I pass by reference in C++?
我需要遍历一个对象向量,并更改它们的一个变量。但是,当我这样做时,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!
问题的根源是你按值迭代,所以你尝试在循环中修改copy。应该改为:
for (Projectile &p : activeProjectiles) {
您根本不需要 void Projectile::setX(float &)
中的参考。看起来你听说要解决你的问题,你需要在某处参考,你找到了随机的地方来放置它。你找错树了。
通常,使用非 const
引用的唯一原因是您打算更改引用的对象。自然地,这样的事情永远不应该发生在 setter 函数中。如果像 setX(my_var);
这样的调用实际上修改了 my_var
,那将是一个很大的惊喜,不是吗?
最好的解决方案是按值传递 float
。
如果你使引用生效 const
,因为那样它就符合 C++ 语言规则,否则会阻止你将引用绑定到未命名的临时对象,例如g - (60)
;但是,那将一事无成,而且看起来很奇怪。 const
引用通常用于传递 "big" 对象时的性能。 float
不是 "big" 对象。
您正在使用数学表达式调用该函数,如果您的函数不是通过引用,该函数将起作用。 g-60 不是变量,那么您将如何引用它?您需要某种具有 地址 的变量或对象,以便通过引用传递它。考虑先做 g -= 60,然后将 g 传递给 setx,或者像上面提到的那样使用 const float&
我需要遍历一个对象向量,并更改它们的一个变量。但是,当我这样做时,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!
问题的根源是你按值迭代,所以你尝试在循环中修改copy。应该改为:
for (Projectile &p : activeProjectiles) {
您根本不需要 void Projectile::setX(float &)
中的参考。看起来你听说要解决你的问题,你需要在某处参考,你找到了随机的地方来放置它。你找错树了。
通常,使用非 const
引用的唯一原因是您打算更改引用的对象。自然地,这样的事情永远不应该发生在 setter 函数中。如果像 setX(my_var);
这样的调用实际上修改了 my_var
,那将是一个很大的惊喜,不是吗?
最好的解决方案是按值传递 float
。
如果你使引用生效 const
,因为那样它就符合 C++ 语言规则,否则会阻止你将引用绑定到未命名的临时对象,例如g - (60)
;但是,那将一事无成,而且看起来很奇怪。 const
引用通常用于传递 "big" 对象时的性能。 float
不是 "big" 对象。
您正在使用数学表达式调用该函数,如果您的函数不是通过引用,该函数将起作用。 g-60 不是变量,那么您将如何引用它?您需要某种具有 地址 的变量或对象,以便通过引用传递它。考虑先做 g -= 60,然后将 g 传递给 setx,或者像上面提到的那样使用 const float&