2014-05-03 125 views
1

我想實現strassen的算法,我雖然要實現一個矩陣類。但是,我得到以下代碼的段錯誤:分割錯誤實現矩陣類C++

class Matrix { 
    public: 
     vector < vector <int> > m; 
     int r; 
     int c; 
     Matrix() {;} 
     Matrix(int _r, int _c) { 
      r = _r; 
      c = _c; 
      m.resize(r); 
      for (int i = 0; i < r; i++) { 
       m[i].resize(c); 
      } 
      for(int i =0; i < r; i++){ 
       for(int j=0; j< c; j++){ 
        m[i][j] = 0; 
       } 
      } 
     } 
     friend ostream& operator<<(ostream &out, Matrix &A) { 
      for(int i =0; i<A.r; i++){ 
       out << endl; 
       for(int j=0; j<A.c; j++){ 
        out << A.m[i][j] << "\t"; 
       } 
      } 
      out<< endl; 
      return out; 
     } 

     Matrix(const Matrix &A) { 
      c = A.c; 
      r = A.r; 
      m.resize(r); 
      for (int i = 0; i < r; i++) { 
       m[i].resize(c); 
      } 
      for(int i =0; i<r; i++){ 
       for(int j=0; j<c; j++){ 
        m[i][j] = A.m[i][j]; 
       } 
      } 
     } 

     Matrix& operator-= (Matrix &A) { 
      assert(A.r == r); 
      assert(A.c == c); 
      for(int i =0; i<r; i++){ 
       for(int j=0; j<c; j++){ 
        m[i][j] -= A.m[i][j]; 
       } 
      } 
      return *this; 
     } 
     Matrix& operator- (Matrix &A) { 
      Matrix C(*this); 
      return C-=A; 
     } 
     Matrix& operator+= (Matrix &A) { 
      assert(A.r == r); 
      assert(A.c == c); 
      for(int i =0; i<r; i++){ 
       for(int j=0; j<c; j++){ 
        m[i][j] += A.m[i][j]; 
       } 
      } 
      return *this; 
     } 
     Matrix& operator+ (Matrix &A) { 
      Matrix C (*this); 
      (C)+=A; 
      return C; 
     } 


     Matrix getBlock(int sR, int eR, int sC, int eC) { 
      assert(sR > eR); 
      assert(sC > eC); 
      Matrix C(eR-sR, eC-sC); 
      for(int i = 0; i < C.r; i++) { 
       for(int j=0; j < C.c; j++) { 
        C.m[i][j] = m[sR+i][sC+j]; 
       } 
      } 
      return C; 
     } 

     friend void swap(Matrix& first, Matrix& second) { 
      using std::swap; 
      swap(first.r, second.r); 
      swap(first.c, second.c); 
      swap(first.m, second.m); 
     } 

     Matrix& operator=(Matrix other){ 
      return *this; 
     } 

     friend Matrix& operator*(const Matrix& A, const Matrix &B) { 
      assert(A.r == B.c); 
      Matrix C(A.r, B.c); 
      for(int i =0; i<C.r; i++){ 
       for(int j=0; j<C.c; j++){ 
        for(int k = 0; k < A.r; k++) { 
         C.m[i][j] += A.m[i][k] * B.m[k][j]; 
        } 
       } 
      } 
      return C; 
     } 

}; 

int main (void) 
{ 
    Matrix A(2,2), B(2,2); 
    A.m[0][0] = 1; A.m[0][1] = 2; 
    A.m[1][0] = 3; A.m[1][1] = 4; 
    B.m[0][0] = 1; B.m[0][1] = 2; 
    B.m[1][0] = 3; B.m[1][1] = 4; 
    Matrix C(2,2); 
    C =A+B; 
    cout << C << endl; 
    return 0; 

} 

如果我嘗試A + = B;它的工作原理......我不明白它與A + B有什麼不同。我試圖打印C之前從

Matrix& operator+ (Matrix & 
    Matrix C (*this); 
    (C)+=A; 
    return C; 
} 

這是正確的。當代碼碰到返回時,我的程序崩潰。我想了解我做錯了什麼。非常感謝。 Davide

+2

將'operator +'的返回類型從'Matrix&'更改爲'Matrix',然後考慮您返回的引用變量的生命週期。 – WhozCraig

+0

[可以訪問局部變量的內存是否可以在其作用域之外訪問?](http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope) – chris

+0

考慮替換'assert(Ar == Bc);'拋出異常;這使得調用者可以選擇捕捉和繼續,而不是讓程序中止。 –

回答

0

不能使用局部變量作爲L值的返回值。

Matrix& operator=(Matrix && other){ 
      this->m = other.m; 
      return *this; 
     } 

Matrix operator+ (Matrix &A) { 
      Matrix C (*this); 
      (C)+=A; 
      return std::move(C); 
     } 

這會解決這個問題。

0

正如其他人指出的那樣,問題是您返回一個局部變量的引用,當該函數退出時該局部變量將被銷燬。

實現operator+通常的方法是作爲一個非成員函數:

Matrix operator+(Matrix A, Matrix const &B) 
{ 
    return A += B; 
} 

這種方法比,它允許轉換到左邊的操作數發生的成員函數更好。

您的operator-operator*具有相同的問題。

+0

謝謝,在閱讀完所提示的教程之後,這非常有意義。 – Kude