2011-07-18 18 views
0

HERESに私のクラス演算子のオーバーロード奇妙な結果

​​

私は間違った結果を取得しています。たとえば、このワークス:

Vector vChange = velocity * time; 
position += vChange; 

しばらくこのdoesntの:

position += velocity * time; 

それがコンパイルされ、実行されますが、この1のために

同じ位置にいくつかの偽の書き込みを行う。すなわち:

Vector& Reflect(const Vector& I, const Vector& N) 
{ 
Vector v = I - 2 * Dot(N, I) * N; 
} 

何が間違っているのかアドバイスできますか?ありがとう!

+1

[オペレータオーバーロードFAQ](http://stackoverflow.com/q/4421706/46642)を読むことをお勧めします。 –

答えて

5

ローカル変数への参照をoperator*に戻しています。それは未定義の動作です。代わりに値で返します。

Vector Vector::operator*(float n) const 
{ 
    Vector result = *this; 
    result.x *= n; 
    result.y *= n; 
    result.z *= n; 
    return result; 
} 

operator+と同じです。

1

ローカル変数への参照を返します。それをしないでください。あなたの配属していない演算子は、参考ではなく、価値によって返されるべきです。

2

operator*operator+の場合は、参考値ではなくVectorを値で返す必要があります。あなたが持っているものは、ぶら下がっている参照を返すことです。それは未定義の動作です。

+0

私はまだ+ =の参照を返しますか? –

+0

@Mikhail:はい、その場合は 'this'を返すので、範囲外になるローカル変数ではありません。 –

関連する問題