我有一个问题,想要使用[]运算符来赋值,我有2个不同的错误,
"二进制' =':找不到哪个操作符采用了类型' double'的右手操作数。 (或者没有可接受的转换)"
没有操作员" ="匹配这些操作数。
我在这里错过了什么吗?
标题
Class CMyVector{
public:
double operator[](const int index) const;
double & operator[](const int index);
CMyVector operator+(const CMyVector mv1);
}
CPP
double CMyVector::operator[](const int index) const
{
return arr[index];
}
double & CMyVector::operator[](const int index)
{
return arr[index];
}
CMyVector CMyVector::operator+(const CMyVector mv1)
{
CMyVector *retval = new CMyVector();
retval[0] = arr[i] + mv1[i];
return *this;
}
答案 0 :(得分:2)
CMyVector CMyVector::operator+(const CMyVector mv1)
{
CMyVector *retval = new CMyVector();
for (int i = 0;i < dim;i++)
{
retval[i] = arr[i] + mv1[i];
}
return *this;
}
此功能存在一些问题:
您不应动态分配CMyVector
以按值返回;这只会泄漏内存并导致不必要的成本。它应该是CMyVector retval;
。
由于retval
是一个指针,retval[i]
正试图像数组一样下标它。你需要(*retval)[i]
,但是由于我们摆脱了上面的动态分配,你可以retval[i]
。
您返回*this
而不是*retval
。现在应该是return retval;
。
您应该通过引用来参考,以避免副本。
operator+
通常最好作为非成员函数实现,以便对称处理参数。
固定代码:
CMyVector operator+(const CMyVector& lhs, const CMyVector& rhs)
{
CMyVector retval;
for (int i = 0; i < dim; i++)
{
retval[i] = lhs[i] + rhs[i];
}
return retval;
}
答案 1 :(得分:2)
CMyVector::operator+
似乎很奇怪。
1. retval
是一个指针(即CMyVector *
),然后retval[i]
将是CMyVector
,这对retval[i] = arr[i] + mv1[i];
没有意义。你的意思可能是(*retval)[i] = arr[i] + mv1[i];
。顺便说一句:这是一个内存泄漏,因为你没有delete
指针。
2.您new
指针retval
,然后在其上设置值,最后返回*this
?这没有意义。你可能意思是:
CMyVector CMyVector::operator+(const CMyVector& mv1)
{
CMyVector retval;
for (int i = 0;i < dim;i++)
{
retval[i] = arr[i] + mv1[i];
}
return retval;
}
答案 2 :(得分:1)
在加法运算符函数中,retval
是指针,这意味着您必须取消引用它才能使用运算符&#34; inline&#34;:
(*retval)[i] = ...
或者您可以使用&#34;箭头&#34;显式调用操作员功能。运算符(为您解除引用):
retval->operator[](i) = ...
然而变量不应该是指针,因为它应该返回值,这意味着你的运算符函数是有缺陷的,它会给你一个内存泄漏和没有返回正确的值。
参见例如this operator overloading reference有关如何实施它的示例。