Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我如何在C++;?_C++_Pass By Reference - Fatal编程技术网

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

我需要遍历对象的向量,并更改它们的变量。但是,当我这样做时,C++给了我以下错误:

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
函数。