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!由于您评估-VecE了两次,因此您对向量进行了两次否定,并且(当然)否定的否定是原始值。

要实施此更改,您需要更改operator-()声明以返回 aVector而不是 a 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;
};
于 2012-11-19T20:39:43.050 回答
0

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
}
于 2012-11-19T20:57:04.147 回答