所以我正在处理运算符重载,并且意识到我的否定运算符不能正常工作。我不确定我做错了什么。
.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&lt;&lt;过载代码:
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;
};
答案 0 :(得分:7)
您需要返回向量的副本。这样写的方式,表达式-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;
};
答案 1 :(得分: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
}