私は次のものを持っています:
//in Matrix.h
class Matrix
{
public:
Matrix (int _row1=1, int _col1=1);
Matrix(const Matrix &);
~Matrix();
int row1;
//int row2;
int col1;
double **m;
//other functions and members...
void Print(int id);
}
//In Matrix.cpp
Matrix::Matrix(int _row1, int _col1): row1(_row1),col1(_col1)
{
m=(double **) new double[row1];
for(long p=0;p<row1;p++) m[p]=(double *) new double[col1];
for(long p=0;p<row1;p++) for (long q=0;q<col1;q++) m[p][q]=0.0;
}
//copy constructor
Matrix::Matrix(const Matrix &Mat){
m=(double **) new double[row1];
**m=**Mat.m;// copy the value
}
// Destructor
Matrix::~Matrix(void){
//We need to deallocate our buffer
delete[] *m;
delete [] m;
//Set m to null just in case
m=0;
cout<<" Freeing m "<<endl;
}
void Matrix::Print(int id)
{
cout<<"Element ID: "<<id<<endl;
for(int i=0; i<row1; i++) {
for(int j=0;j<col1;j++) {
cout<<m[i][j];
if(j==col1-1) cout<<"\n";
}
}
system("PAUSE");
}
次のような呼び出し:
elem[e].d0 = matel[i].OrgD;// Both Matrix
elem[e].d0.Print(1); // checking to see if at all copied
失敗:
void Matrix::Print(int id){
//...
cout<<m[i][j];//here
...//
}
実際、m[i][j] が他の関数で使用されている場合はどこでも失敗します。これは、オブジェクトが連続して使用された場合にのみ発生します。デストラクタをコメントアウトすると、このエラーはなくなります。わからない?どんな助けでも!
編集 1: コピー コンストラクターを次のように変更しました。
Matrix::Matrix(const Matrix &Mat):row1(Mat.row1),col1(Mat.col1)
{
m= new double *[row1];
for(long p=0;p<row1;p++) m[p]=new double [col1];
for(long p=0;p<row1;p++)for (long q=0;q<col1;q++) m[p][q]=Mat.m[p][q];
// copy the Value
}
そして、代入演算子を次のようにします。
Matrix& Matrix::operator = (const Matrix& o) {
if ( this == &o ) {
return *this; //Self assignment : nothing to do
}
delete[] *m;
delete[] m;
row1 = o.row1;
col1 = o.col1;
m = new double*[row1];
for(long p=0;p<row1;p++) m[p]=new double [col1];
for(long p=0;p<row1;p++) for (long q=0;q<col1;q++) m[p][q]=o.m[p][q];
return *this;
}
今では失敗します:
Matrix::Operator=...
{
o.m[p] 0xcdcdcdcd double *
CXX0030: Error: expression cannot be evaluated // in the debugger
}
「m」を削除するデストラクタがある場合、呼び出し元オブジェクトの m である「.m」を使用するすべての関数で同じことが起こることに気付きました。いくつかの答えを得ることを願っています。