0

私は次のものを持っています:

//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」を使用するすべての関数で同じことが起こることに気付きました。いくつかの答えを得ることを願っています。

4

1 に答える 1

0

使用しているコンストラクターで

m=(double **) new double[row1];
for(long p=0;p<row1;p++) m[p]=(double *) new double[col1];

new double[row1]タイプdouble[]です。これを にキャストしdouble**ます。new (double*)[row1]double ポインターの配列を本当に取得したい場合は、ここで使用する必要があります。

于 2013-06-28T10:24:55.753 に答える