2012-02-03 102 views
1

我想做一個例子(只是例子!我知道它泄漏)的應用程序來學習運算符在C++中的重載,但我得到的值的零元素的總和....我懷疑問題是複製構造函數int。不工作矩陣運算符+重載

詳細的實施低於:

class Matrix{ 
    public: 
     Matrix(int row, int col); 
     Matrix(const Matrix& src); 
     float& set(int row, int col); 
     float get(int row, int col); 
     const Matrix & operator+(const Matrix& rhs); 

    private: 
     float* data; 
     int nrow; 
     int ncol; 
}; 

Matrix::Matrix(int row, int col){ 
    nrow = row; 
    ncol = ncol; 
    data = new float[nrow*ncol]; 
} 

Matrix::Matrix(const Matrix& src){ 
    nrow = src.nrow; 
    ncol = src.ncol; 
    data = new float[nrow*ncol]; 

    for(int i = 0; i < nrow*ncol; i++){ 
     data[i] = src.data[i]; 
    } 
} 

float& Matrix::set(int row, int col){ 
    return data[row*ncol+col]; 
} 

float Matrix::get(int row, int col){ 
    return data[row*ncol+col]; 
} 

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

    if (this->nrow == rhs.nrow && this->ncol == rhs.ncol){ 
     Matrix* m = new Matrix(rhs.nrow, rhs.ncol); 
     for(int i=0; i< nrow*ncol; i++){ 
      m->data[i] = data[i] + rhs.data[i]; 
     } 
     return *m; 
    } else { 
     throw -1; 
    } 
} 

#include <iostream> 

using namespace std; 

int main() 
{ 
    Matrix A(1,1); 
    Matrix B(1,1); 

    A.set(0,0)=1; 
    B.set(0,0)=2; 

    cout << A.get(0,0) << endl; 
    cout << B.get(0,0) << endl; 

    Matrix C = A + B; // Marix C(A+B); 
    cout << C.get(0,0) << endl; 

    return 0; 
} 
+0

我沒有在那裏看到析構函數。你違反[三條規則](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-reeree)? – 2012-02-03 14:49:43

+0

我不知道爲什麼這不起作用,但有兩件事情脫穎而出。這段代碼泄露了整個地方的內存。它應該有一個析構函數來清理內存,甚至更好,它應該使用智能指針來管理內存。你也是一個整數。拋出一個類最好的做法是,最好是從std :: exception派生出一個類。 – mcnicholls 2012-02-03 14:54:29

回答

5
Matrix::Matrix(int row, int col){ 
    nrow = row; 
    ncol = ncol; 
    data = new float[nrow*ncol]; 
} 

有一個錯字在那裏,有不確定的行爲在你的代碼。

與修復:

ncol = col; 

(確保你把你編譯器警告/診斷級別設爲最大,GCC抓住這一點)

你泄露你的float[]太,所以你代碼不完整。不要忘記添加適當的析構函數,並始終遵循rule of three