1

状況に応じて機能する代入演算子があるようです。x と y の 2 つの float を含む Vector2 クラスがあります。operator= メソッドは次のとおりです。

Vector2 Vector2::operator=(const Vector2 &right)
{
    Vector2 result;
    result.x = right.x;
    result.y = right.y;
    return result;
}

私が持っているエンティティの onMove メソッド内:

Vector2 newPosition = position + (speed * getSpeedFactor());

if (posValid(newPosition))
{
    position.x = newPosition.x;
    position.y = newPosition.y;
    //position = newPosition;
}

speedFactor はフレームレートに依存し、posValid はポイントが壁などにあるかどうかのチェックです。位置と速度も Vector2 です。最初の課題:

Vector2 newPosition = position + (speed * getSpeedFactor());

動作し、コードをそのまま使用すると、期待/意図した動作が得られますが、

position = newPosition;

単独でも、.x & .y 代入の前後でも効果はありません。

4

2 に答える 2

14

あなたoperator=()は間違っています。作成した余分なものではなく、現在のオブジェクトを変更する必要があります

Vector2& Vector2::operator=(const Vector2 &right) 
{
  x = right.x; 
  y = right.y; 
  return *this; 
}

:戻り値の型は参照であり、現在のオブジェクトへの参照を返しています。そのコピー(またはコードのような新しいオブジェクト)ではありません。

効いた理由

Vector2 newPosition = ...;

これは、デフォルト コンストラクト + 代入ではなく、コピー コンストラクト呼び出しであるためです。

于 2012-06-22T14:28:13.790 に答える
1

あなたは実際にに割り当てていませんposition。一時Vector2オブジェクトを作成して割り当て、暗黙的にコピーしてコピーを返します。実際のオブジェクトを変更することはありません。

次のようなものが必要です。

Vector2& Vector2::operator=(const Vector2 &right)
{
    x = right.x;
    y = right.y;
    return *this;
}
于 2012-06-22T14:30:31.227 に答える