1

だから私はC++で小さな数学ライブラリを書いていて、ベクトルを掛けたスカラーを扱うとき、この操作を実行しようとするといくつかの問題が発生します

Vect V2;
Vect V3;
float S;

Vect V1 = V2 + S * (V2 - V3);

オーバーロードされた演算子*で受け取るVect値は、新しいVectオブジェクトであり、操作の(V2-V3)部分の結果ではありません。これがコードの他の関連部分です。デバッグを伴う操作を実行すると、2つのオーバーロードされた演算子はそれ自体では正しく機能しますが、次々と機能しません。

Vect.h

Vect &operator - (const Vect &inVect);
friend const Vect operator*(const float scale, const Vect &inVect);

Vect.cpp

Vect &Vect::operator - (const Vect &inVect)
{
    return Vect (this->x - inVect.x,this->y - inVect.y,this->z - inVect.z, 1);
}

const Vect operator*(const float scale, const Vect &inVect)
{
    Vect result;

    result.x = InVect.x * scale;
    result.z = InVect.y * scale;
    result.y = InVect.z * scale;
    result.w = 1;

    return result;
}

また、+および=演算子をオーバーロードしましたが、期待どおりに機能します。発生する唯一の問題は、上記の問題です。

4

1 に答える 1

5

operator-で、一時を作成し、Vectその一時への参照を返します。一時はreturnステートメントの終わりで破棄され、返された参照はぶら下がったままになります。この参照を使用して何かを行うと、未定義の動作が発生します。

代わりに、値operator-でaを返す必要があります。Vect

Vect Vect::operator - (const Vect &inVect)
{
  return Vect (this->x - inVect.x,this->y - inVect.y,this->z - inVect.z, 1);
}
于 2013-02-09T12:42:31.257 に答える