Перегрузка оператора = отрицание не работает должным образом

Так что я работаю с перегрузкой операторов и просто понял, что мой оператор отрицания работает не так, как должно быть. Я не совсем уверен, что я сделал не так.

.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;
};

1

Решение

Вам необходимо вернуть копия вектора. Как это написано, выражение -VecE будет на самом деле модифицировать VecE! Так как вы оцениваете -VecE дважды вы отрицаете вектор дважды, и (конечно) отрицание отрицания является исходным значением.

Чтобы реализовать это изменение, вам нужно изменить operator-() декларация о возврате Vector вместо Vector &,

Например:

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;
};
7

Другие решения

cdhowie прав. Вы отрицаете дважды.

Тем не менее, я не думаю, что вам нужно изменить реализацию.

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
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector