【问题标题】:How can I pass by reference in C++?如何在 C++ 中通过引用传递?
【发布时间】:2017-12-04 18:17:34
【问题描述】:

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

任何帮助将不胜感激。

【问题讨论】:

  • Projectile::setX()中没有理由通过引用传递
  • 您可以删除this-> 表示法,因为参数和数据成员具有不同的名称。直接访问数据成员:x = _x;
  • 就我个人而言,我会从_x 中删除那些繁琐的_,因为this->x = x; 是明确且富有表现力的。
  • getX 应该是const 函数。

标签: c++ pass-by-reference


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    通常,使用非const 引用的唯一原因是您打算更改引用的对象。自然,这样的事情绝不应该出现在 setter 函数中。如果像setX(my_var); 这样的调用实际上修改了my_var,那将是一个很大的惊喜,不是吗?

    最好的解决方案是通过值传递float

    如果您将其设为const,您可以获得工作引用,因为这样它将符合C++ 语言规则,否则会阻止您将引用绑定到一个未命名的临时对象,例如由g - (60) 产生的对象;但是,这将一事无成,而且看起来很奇怪。 const 引用通常用于传递“大”对象时的性能。 float 不是“大”对象。

    【讨论】:

      【解决方案3】:

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

      for (Projectile &p : activeProjectiles) {
      

      您根本不需要void Projectile::setX(float &) 中的引用。看起来您听说要解决您的问题,您需要在某处参考,并且您找到了随机放置它的位置。你在找错树了。

      【讨论】:

        【解决方案4】:

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

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

        确实,如果您要像在此处那样将临时绑定到它,它必须const float&


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


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

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

        【讨论】:

          猜你喜欢
          • 2019-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-14
          • 1970-01-01
          • 2010-12-24
          • 2021-11-28
          • 1970-01-01
          相关资源
          最近更新 更多