2012-02-03 12 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

そこにデストラクタが表示されません。あなたは[three of rule](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three)に違反していますか? –

+0

なぜこれがうまくいかないのか分かりませんが、2つのことが際立ちます。このコードは、メモリを全面的にリークします。それはメモリをクリーンアップするためのデストラクタを持つ必要があります。また、スマートポインタを使用してメモリを管理する必要があります。またintを投げています。クラスをスローするのがベストプラクティスであり、最も好ましくはstd :: exceptionから派生したものです。 – mcnicholls

答えて

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

あなたのコードの結果は未定義の動作を持っていることそこにタイプミスがあります。

はでそれを修正:

ncol = col; 

(あなたが警告/診断が最大にレベルのコンパイラ回すことを確認し、GCCはこれをキャッチ。)

あなたのfloat[]すぎるよ、あなたのように漏れていますコードは完全ではありません。適切なデストラクタを追加することを忘れずに、常にrule of threeに従ってください。

関連する問題