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

时间:2017-06-30 17:53:55

标签: c++ pass-by-reference

我需要遍历一个对象向量,并更改它们的变量。但是,当我这样做时,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循环中:

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;
}

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:10)

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

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

实际上,如果您要将临时绑定到它,必须 const float&,就像在此处一样。

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

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

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

答案 1 :(得分:0)

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

for (Projectile &p : activeProjectiles) {

您根本不需要void Projectile::setX(float &)中的引用。看起来你听说要修复你的问题,你需要在某个地方参考,你找到随机的地方把它。你在错误的树上吠叫。

答案 2 :(得分:0)

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

最佳解决方案是按值传递float

如果你将它引用const,你可以获得引用,因为它符合C ++语言规则,否则会阻止你绑定对未命名的临时对象的引用,例如{{{{{ 1}};然而,这将无所作为,只是看起来很奇怪。通过" big" g - (60)引用通常用于表现。对象。 const不是"大"对象

答案 3 :(得分:0)

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