2016-04-07 35 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的正確值。 –