重载括号操作员分配

时间:2016-04-07 14:25:41

标签: c++ operator-overloading

我有一个问题,想要使用[]运算符来赋值,我有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;
}

3 个答案:

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

此功能存在一些问题:

  1. 您不应动态分配CMyVector以按值返回;这只会泄漏内存并导致不必要的成本。它应该是CMyVector retval;

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

  3. 您返回*this而不是*retval。现在应该是return retval;

  4. 您应该通过引用来参考,以避免副本。

  5. operator+通常最好作为非成员函数实现,以便对称处理参数。

  6. 固定代码:

    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有关如何实施它的示例。