2012-04-06 61 views
0

我正在努力讓我的頭繞着運算符重載。在這種情況下,我有+運營商和我試過的例子,任何幫助將不勝感激。運算符重載C++的建議

我得到它說「invaild使用‘類矩陣’我不確定如何解決這個問題我怎麼能添加這兩個矩陣的對象一起錯誤?

Matrix Matrix::operator+(const Matrix& rhs){ 
return Matrix(Matrix + rhs.Matrix()); 
} 


    Matrix::Matrix(int MM, int NN){ 
        M = MM; 
        N = NN; 
        data = new double[M * N]; 
        for (int i =0; i < M; i++) 
        { 
         for (int j = 0; j < N; j++) 
         { 
          data[i* N+j] = (double) 1000 + i*N+j; 
        //  cout << data[i*N+j] <<"\t"; 
         } 
         //cout <<"\n"; 
        } 

     cout << "Matrix Constructor... (code to be implemented here!!!)\n";} 

感謝

+1

你的問題是什麼? – Christian 2012-04-06 10:52:05

+0

關於運算符重載的一個很好的閱讀http://courses.cms.caltech.edu/cs11/material/cpp/donnie/cpp-ops.html – Marius 2012-04-06 12:31:23

回答

1

jpm的回答非常重要。一旦你解決了這些問題,你可以看看我的。

實質上,運算符重載與其他函數沒有區別。

因此,在案件:

Matrix Matrix::operator+(const Matrix& rhs) 

你真的做什麼有一句話:添加到RHS當前矩陣,並返回一個新的矩陣。你的超載不應該改變當前的矩陣。幫助自己,並用一個常數:

Matrix Matrix::operator+(const Matrix& rhs) const 

矩陣加法一樣,應該先檢查是否矩陣具有相同的尺寸,這樣就可以通過所有的「細胞」,一起加入他們,然後循環和添加它們,並創建一個矩陣。對於這一點,我猜你需要一個第二個構造函數,是這樣的:

Matrix::Matrix(int MM, int NN, double values[]) 
{ 
    M = MM;//TODO: change to width 
    N = NN;//TODO: change to height 
    data = new double[M*N]; 
    for(int i < 0; i < M; i++) 
     for(int j < 0; j < N; j++) 
      data[i * N+j] = values[i * N+j]; 
} 
+1

只是爲了澄清一點。當他說「將rhs添加到我的當前矩陣中」時,他並沒有改變當前矩陣的值。該運算符不應該影響當前矩陣的狀態。相反,我們希望從這個矩陣中取值,將它們添加到rhs的值中,並將所有結果填入一個全新的矩陣。只是要清楚。 – jpm 2012-04-06 11:12:10

+0

@jpm相當好,先生。 – MPelletier 2012-04-06 11:14:46

4
  1. RHS 一個Matrix
  2. 調用構造函數的方法等是
  3. 在十分非法,Matrix不是標識符
  4. 一旦您將標識符清理出來,*this + rhs就相當於this->operator+(rhs)。從這裏可以明顯看出,你在這裏完成的所有工作都是創建一個無限遞歸。
+1

我甚至沒有看你的構造函數代碼,所以請不要理解它從這份名單中缺席我認可它的有效性。 – jpm 2012-04-06 10:59:02

+1

此外,由於您在構造函數中使用'new'通過堆內存管理'data'成員(並且可能在您的析構函數中使用了相應的'delete'),因此您應該定義一個複製構造函數和賦值運算符,數據的副本,因爲C++提供的默認數據可能會導致像多個'Matrix'實例引用相同'data'指針(如果被複制)和副本上懸掛指針問題的問題。 – 2012-04-06 11:17:39

+0

'Matrix'是一個標識符,它只是一個類型而不是一個變量。 – 2012-04-06 12:49:43

0
return Matrix(Matrix + rhs.Matrix()); 
       ^^^^^^  ^^^^^^ 

您使用那裏應該是一個表達式類型名稱(Matrix) - 這是編譯器是什麼抱怨。你也試圖在一個現有的對象上調用構造函數,這是無效的(和無意義的)。您似乎也試圖以自稱的方式實施operator+;如果你以某種方式進行編譯,那麼由於無限遞歸會導致堆棧溢出。

也許是爲了實現除了最簡單的方法是實施operator+=一個矩陣添加到現有的一個,然後在這方面實現operator+

Matrix & Matrix::operator+=(Matrix const & rhs) { 
    // Perform addition here 
    for (int i = 0; i < N*M; ++i) { 
     data[i] += rhs.data[i]; 
    } 
    return *this; 
} 

// This can be a non-member function 
// Pass "lhs" by value to get a copy, then modify and return that. 
Matrix operator+(Matrix lhs, Matrix const & lhs) { 
    return lhs += rhs; 
} 

// Or if you really want a member function for some reason 
Matrix Matrix::operator+(Matix const & rhs) const { 
    return Matrix(*this) += rhs; 
} 

但這需要你有一個正確的拷貝構造函數 - 由於您在構造函數中自己分配內存,並且可能將其釋放到析構函數中,所以您必須執行實施複製構造函數以正確分配新內存(根據Rule of Three),否則您將在執行後雙重刪除複製一個矩陣。