2016-04-07 40 views
1

我有一个问题搞清楚使用[]操作符来指定值,我有2个不同的错误,重载托架操作者分配

“二进制‘=’:没有操作员发现它接受一个右边的操作数类型'双'(或没有可接受的转换)“

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

我在这里错过了什么吗?

页眉

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

回答

2

CMyVector::operator+似乎不可思议。

1. retval是一个指针(即CMyVector *),然后retval[i]CMyVector,它是没有意义的用于retval[i] = arr[i] + mv1[i];。你可能意思是(*retval)[i] = arr[i] + mv1[i];。顺便说一句:这是一个内存泄漏,因为你没有delete的指针。

2.You 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; 
} 
1

在加法运算功能,retval指针,这意味着你必须取消对它的引用使用操作 “内联”:

(*retval)[i] = ... 

或者你可以调用操作功能明确使用“箭头”操作符(它执行非关联你):

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

然而变量应该是一个指针,因为它是你应该返回,这意味着你的操作功能有缺陷,因为它会给你一个内存泄漏不能返回正确的值。

参见例如this operator overloading reference举例说明如何实现它。

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+通常最好作为非成员函数实现,以便对称处理参数。

固定代码:

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

工作就像一个魅力,但我只是用*这在下面的答案中提到。 –

+0

@JoachimGotzes这有一个完全不同的含义,不会给你你想要的。请注意,Joachim从他的回答中删除了这一点,他可能认为你正在执行'operator + ='而不是其他东西。 – TartanLlama

+0

是的,你是正确的,但我仍然工作,如果我说vec = vec2 * 2;我有vec的正确值。 –