重载括号运算符赋值

Overload bracket operator assign

我在使用 [] 运算符赋值时遇到问题,我有 2 个不同的错误,

"binary '=': no operator found which takes a right-hand operand of type 'double' (or there is no acceptable conversion)"

没有运算符“=”匹配这些操作数。

我是不是漏掉了什么?

页眉

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

在加法运算符函数中,retval是一个指针,这意味着您必须取消引用它才能使用运算符"inline":

(*retval)[i] = ...

或者您可以使用 "arrow" 运算符显式调用运算符函数(它会为您取消引用):

retval->operator[](i) = ...

但是变量应该是一个指针,因为它是你应该return,这意味着您的运算符函数存在缺陷,因为它会给您带来内存泄漏 而不是 return 正确的值。

参见例如this operator overloading reference 有关如何实施它的示例。

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

这个函数有一些问题:

  1. 您不应该动态分配 CMyVector 以便按值 return;那只会泄漏内存并产生不必要的成本。它应该只是 CMyVector retval;.

  2. 由于retval是一个指针,retval[i]试图像数组一样对其下标。你会想要 (*retval)[i],但由于我们摆脱了上面的动态分配,你可以只做 retval[i].

  3. 你 return *this 而不是 *retval。现在应该是 return retval;.

  4. 你应该引用你的论点以避免复制。

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

CMyVector::operator+ 看起来很奇怪。

1.retval是指针,(即CMyVector *),那么retval[i]就是CMyVector,对[=16=没有意义].你的意思可能是 (*retval)[i] = arr[i] + mv1[i];。顺便说一句:这是内存泄漏,因为您没有 delete 指针。

2.Younew一个指针retval,然后给它赋值,最后return*this?这没有意义。您可能是指:

CMyVector CMyVector::operator+(const CMyVector& mv1)
{
    CMyVector retval;
    for (int i = 0;i < dim;i++)
    {
         retval[i] = arr[i] + mv1[i];
    }
    return retval;
}