1

そのため、演算子のオーバーロードに取り組んでいますが、否定演算子が本来の動作をしていないことに気付きました。何が間違っていたのか正確にはわかりません。

.h 署名

Vector & Vector::operator-()

.cpp の実装

Vector & Vector::operator-()
{
pVec[0] = -pVec[0];
pVec[1] = -pVec[1];
pVec[2] = -pVec[2];

return *this;

};

呼び出し:

cout << "-Vector E = " << -VecE << (-VecE).Magnitude() << endl << endl;

VecE の変数は [0, 1 , 1] のようなものです。これは、これが呼び出されたときに [0, -1, -1] として表示する必要があることを意味しますが、そうではありません。それで、私は何が欠けていますか?

編集: コピー コンストラクターと iostream<< オーバーロード コードの追加:

Vector::Vector(const Vector & Copy)
{
pVec = new double[3];
if (0 == pVec)
{
    exit(1);
}
else
{
    pVec[0] = Copy.pVec[0];
    pVec[1] = Copy.pVec[1];
    pVec[2] = Copy.pVec[2];
}
};

ostream & operator<<(ostream & Out, Vector & RHS)
{
cout.precision(1);
Out << fixed <<  "[ " << RHS.pVec[0] << " " << RHS.pVec[1] << " " << RHS.pVec[2] << " ]" << resetiosflags (ios_base::fixed);
return Out;
};
4

2 に答える 2

7

ベクターのコピーを返す必要があります。この書き方では、式-VecEは実際に変更 VecEされます。2 回評価するので-VecE、ベクトルを 2 回否定していることになり、(もちろん) 否定の否定が元の値になります。

この変更を実装するには、 の代わりに aoperator-()を返すように宣言を変更する必要があります。VectorVector &

例えば:

Vector Vector::operator-()
{
    Vector copy(*this);

    copy.pVec[0] = -copy.pVec[0];
    copy.pVec[1] = -copy.pVec[1];
    copy.pVec[2] = -copy.pVec[2];

    return copy;
};
于 2012-11-19T20:39:43.050 に答える
0

cdhowie は正しいです。あなたは2回否定しています。

とはいえ、実装を変更する必要はないと思います。

Vector const NegVecE = -VecE;
cout << "-Vector E = " << NegVecE << NegVecE.Magnitude() << endl << endl;

編集: PiotrNycz が指摘しているように、これは機能しますが、最終状態は直感的ではないため、正しい解決策はコピーを返すことです。

{
int i = 3;
int j = -i; //you would expect i to still be 3 here
}
于 2012-11-19T20:57:04.147 に答える