1

2Dベクトル(およびスカラー)のoperator-(および)をオーバーロードしました:-=

Vector2D Vector2D::operator-(const Vector2D& rhs) {
    return Vector2D(this->GetX() - rhs.GetX(), this->GetY() - rhs.GetY());
}

私がこれをしなければならなかったことを文句を言わないようにこの呼び出しを取得するためにno operator '-' matches these arguments

a2de::Vector2D Vector2D::GetFacingVector(const Vector2D& target, const Vector2D& source) {
    a2de::Vector2D facingVec(const_cast<Vector2D&>(target) - const_cast<Vector2D&>(source));
    return facingVec;
}

またはこれ:

a2de::Vector2D Vector2D::GetFacingVector(const Vector2D& target, const Vector2D& source) {
    a2de::Vector2D facingVec(Vector2D(target) - Vector2D(source));
    return facingVec;
}

どちらも非常に悪いことのようです。const_cast(「コンパイラはあなたがやっていることを想定しているので、あなたが何をしているのかを知っているときにのみ使用してください!」というフレーズにかかわらず)

これらは正しいですか、それとも同じことを達成するためのより良い方法がありますか?

4

6 に答える 6

2

オペレーターは次のとおりです。

Vector2D Vector2D::operator-(const Vector2D& rhs) const

constに注意してください。

于 2012-08-10T02:21:14.090 に答える
2

メンバー関数operator-として宣言する必要がconstあります。つまり、変更しないことを約束します*this

Vector2D Vector2D::operator-(const Vector2D& rhs) const {
    return Vector2D(this->GetX() - rhs.GetX(), this->GetY() - rhs.GetY());
}

または、非メンバーにして、マイナス記号の右側だけでなく両側で暗黙的な変換が行われるようにすることもできます。

inline Vector2D operator-(const Vector2D& lhs, const Vector2D& rhs) {
    Vector2D result(lhs);
    result -= rhs;
    return result;
}
于 2012-08-10T02:21:40.410 に答える
2

使い方はたくさんありますconst。ここにあなたの問題を解決するかもしれないものがあります

Vector2D Vector2D::operator-(const Vector2D& rhs) const
{
    return Vector2D(this->GetX() - rhs.GetX(), this->GetY() - rhs.GetY());
}

constメソッドの最後にあることに注意してください。これは、メソッドがスコープ中にメンバー変数を変更しないことが保証されていることを意味します。

于 2012-08-10T02:22:26.493 に答える
1

演算子を const メンバー関数としてマークしてみてください。

于 2012-08-10T02:20:13.203 に答える
1

思いついた言葉は書かないようにしたほうがいいです。言うまでもなく、彼らはこの回答に極端な反対票を投じ、おそらくRedditの群衆を引きずり込むことさえあります. とにかく、メンバー関数は ではないため、非引数constで呼び出す必要があります。const

直接の技術的な修正は次のとおりです。

Vector2D Vector2D::operator-(const Vector2D& rhs) const
{
    return Vector2D(this->GetX() - rhs.GetX(), this->GetY() - rhs.GetY());
}

演算子を独立した関数として使用する、より良い方法を次に示します。

Vector2D operator-( Vector2D const& a, Vector2D const& b)
{
    return Vector2D( a.GetX() - b.GetX(), a.GetY() - b.GetY() );
}

最後にネーミングを考えます。あなたは書いたことがありますgetSin( angle )か?いいえ?

Vector2D operator-( Vector2D const& a, Vector2D const& b)
{
    return Vector2D( a.x() - b.x(), a.y() - b.y() );
}
于 2012-08-10T02:22:28.790 に答える
0

もう 1 つの可能性は、operator を非メンバー関数にすることです。このようにして、問題に遭遇することはありません。また、コンストラクターがあれば、両方の引数を Vector2D に変換できます。

class Vector2D
{
...
    Vector2D& operator-=(const Vector2D& rhs)
    {
      this->x -= rhs.GetX();
      this->y -= rhs.GetY();
      return *this;
    }
...
};

Vector2D Vector2D::operator-(const Vector2D& lhs, const Vector2D& rhs)
{
  Vector2D temp(lhs);
  return temp -= rhs;
}

標準のほとんどの非変更算術演算子は、このように非メンバー対称です。

于 2012-08-10T02:41:12.680 に答える