如何在 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&