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;
}
そこにデストラクタが表示されません。あなたは[three of rule](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three)に違反していますか? –
なぜこれがうまくいかないのか分かりませんが、2つのことが際立ちます。このコードは、メモリを全面的にリークします。それはメモリをクリーンアップするためのデストラクタを持つ必要があります。また、スマートポインタを使用してメモリを管理する必要があります。またintを投げています。クラスをスローするのがベストプラクティスであり、最も好ましくはstd :: exceptionから派生したものです。 – mcnicholls