C++ 我如何在C++;?
我需要遍历对象的向量,并更改它们的变量。但是,当我这样做时,C++给了我以下错误:C++ 我如何在C++;?,c++,pass-by-reference,C++,Pass By Reference,我需要遍历对象的向量,并更改它们的变量。但是,当我这样做时,C++给了我以下错误: void sparket::setX(float&)':无法将参数1从“float”转换为“float&” 引用非常量的初始值必须是左值 我尝试这样做的方式是在这个for循环中: for (Projectile p : activeProjectiles) { if (p.isLeftPublic) { float g = p.getX(); p.s
void sparket::setX(float&)':无法将参数1从“float”转换为“float&”
引用非常量的初始值必须是左值
我尝试这样做的方式是在这个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;
}
任何帮助都将不胜感激。首先,确实没有理由通过引用将
浮点值
传递到此函数中。它已经很小了
但是,如果您真的想这样做,它应该是一个常量浮点&
,因为您并没有修改它
事实上,如果您要将一个临时变量绑定到它,它必须是constfloat&
,就像您在这里所做的那样
tl;dr:
g-(60)
不是一个变量
然后您需要修复循环,该循环目前根本不影响
activeprojectles
:
for (Projectile& p : activeProjectiles) {
// ^ important!
问题的根源是您按值进行迭代,所以您尝试在循环中修改副本。它应该是:
for (Projectile &p : activeProjectiles) {
您根本不需要在
void sparket::setX(float&)
中引用。看起来你听说要解决你的问题,你需要在某个地方引用,然后你找到了一个随机的地方来放置它。您在错误的树上吠叫。通常,使用非常量
引用的唯一原因是您打算更改引用的对象。当然,在setter函数中不应该出现这种情况。如果调用setX(my_var)代码>实际修改了my_var
,不是吗
最好的解决方案是通过值传递浮点值
如果您使它成为代码> const < /C>,您可以得到引用,因为它将遵守C++语言规则,否则会阻止您引用一个未命名的临时对象,就像从<代码> g(60)< /> >所产生的一个未命名的临时对象一样;然而,这将一事无成,只是看起来很奇怪<代码>常量
引用通常用于传递“大”对象时的性能。float
不是一个“大”对象。您使用数学表达式调用函数,如果您的函数不是通过引用调用的,则数学表达式会起作用。g-60不是一个变量,那么您将如何引用它?您需要某种具有地址的变量或对象,以便通过引用传递它。首先考虑G-=60,然后将G传递到SETX,或者类似于使用const浮点和,在<代码>弹丸::SETx()/<代码>中没有理由通过引用。因为参数和数据成员名称不同,所以可以删除<代码> -> < /COD>符号。直接访问数据成员:x=\ux就我个人而言,我会从\ux
中删除这个小小的\ux
作为this->x=x
是明确的和有表现力的。并且getX
应该是const
函数。