2017-06-30 10 views
-3

私はオブジェクトのベクトルを反復処理し、それらの変数を変更する必要があります。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 (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と、私はそうするときただし、C++は私に次のエラーを与えますSetX関数は次のようになります。

float Projectile::getX() { 
    return x; 
} 

void Projectile::setX(float &_x) { 
    this->x = _x; 
} 

Any助けに感謝します。

+3

'Projectile :: setX() 'で参照渡す理由はありません – Slava

+0

' this-> 'notationはパラメータとデータメンバの名前が異なるためです。データメンバーに直接アクセスする: 'x = _x;' –

+1

個人的には、 'this-> x = x;' _xからフェルドリーの '_'を削除しますが、明確で表現力があります。 – Galik

答えて

10

まず、floatをこの関数に渡す理由はありません。それはすでに小さいです。

あなたが本当にしたいのであれば、あなたはそれを変更していないので、それはconst float&でなければなりません。

実際には、ここで行うように、一時的にバインドする場合はconst float&にする必要があります。


TL; DR:

for (Projectile& p : activeProjectiles) { 
//   ^important! 
g - (60)あなたが現在activeProjectilesには全く影響はありませんあなたのループを、修正する必要が続いて変数


ではありません

0

問題の原因は、ループでコピーを修正しようとすると、値によって反復することです。これは、代わりに次のようになります。

for (Projectile &p : activeProjectiles) { 

あなたがすべてでvoid Projectile::setX(float &)に参照する必要はありません。あなたはどこかで参照が必要なあなたの問題を解決するためにそれを聞いたように見え、あなたはそれを置くためにランダムな場所を見つけた。あなたは間違った木を吠えている。

0

通常、非const参照を使用する唯一の理由は、参照オブジェクトを変更する場合です。もちろん、そのようなことは決してセッター機能では起こらないはずです。 setX(my_var);のような電話が実際にmy_varに変更されていれば大きな驚きでしょうか?

最高の解決策は、値でfloatを渡すことです。

constにすると参照を得ることができます。これは、そうでなければg - (60)のような名前のない一時オブジェクトへの参照をバインドできないようにするためです。しかし、それは何も達成せず、ただ奇妙に見えるでしょう。 const参照は、通常、「大きな」オブジェクトを渡すときのパフォーマンスに使用されます。 floatは「大きな」オブジェクトではありません。

0

あなたは関数が参照ではない場合に機能する数式を使用して関数を呼び出しています。g-60は変数ではないので、どのように参照しますか?参照渡しにするには、アドレスの変数やオブジェクトが必要です。最初にg - = 60を実行し、次にsetxにgを渡すか、または上記のようにconst floatを使用することを検討してください。&

関連する問題