从函数返回,具有动态字段c ++的对象

时间:2015-10-03 12:47:05

标签: c++ pointers matrix dynamic

我有一个名为Matrix的类,其中包含一个动态存储的字段。还有一个名为Multiply()的方法,它必须返回乘以2 Matrix的结果。问题是我定义了一个析构函数,当我返回时,存储结果矩阵的变量得到一些随机值,我想这是因为新变量与临时矩阵具有相同的地址。我怎样才能正确归还?

class Matrix{
    double **val;
    int rows,cols,errorCode;
public:
    Matrix();
    Matrix(int);
    Matrix(int, int);
    ~Matrix();
    void Print();
    void Read();
    void Realoc(int, int );
    void Assign(int,int,double);
    Matrix Multiply(Matrix&);
    void Multiply(double);
};

Matrix Matrix::Multiply(Matrix &a){
    if(cols != a.rows){
        Matrix b;
        b.errorCode=112; //That means matrices are not compatible;
        cout<<"WARNING! Error "<<errorCode<<" has occurred. "<<endl;
        return b;
    }
    else{
            //Making a new matrix where we save computed values;
        Matrix b;
        b.Realoc(rows,a.cols);


            //Computing values;
        double  p;
        for(int i=0;i<rows;i++){
            for(int j=0;j<a.cols;j++){
                p=0;
                for(int k=0;k<cols;k++){p += val[i][k]*a.val[k][j];}
                b.Assign(i+1,j+1,p);
            }
        }
        return b;
    }
}

int main(){



Matrix a,b(2,2);
b.Assign(1,1,0);
b.Assign(1,2,3);
b.Assign(2,1,5);
b.Assign(2,2,5);
b.Print();

a.Read();
cout<<endl;
cout<<"'a' multiplied by 'b' is: "<<endl;
Matrix m;
m = a.Multiply(b);
m.Print();
cout<<endl;
return 0;
}

一些想法?

P.S。我制作了复制构造函数,但它没有做任何好的结果。

这是我制作的复制构造函数。

Matrix::Matrix(Matrix &a){
    rows = a.rows;
    cols = a.cols;
    errorCode = 0;
    val = new double*[rows];
    for(int i = 0;i<rows;i++){
        val[i] = new double[cols];
    }
    for(int i=0;i<rows;i++){
        for(int j=0;j<cols;j++){
            val[i][j] = a.val[i][j];
        }
    }
}

析构函数:

Matrix::~Matrix(){
    for(int i=0;i<rows;i++){
        delete[] val[i];
    }
    delete[] val;
}

1 个答案:

答案 0 :(得分:0)

此:

m = a.Multiply(b);

调用赋值运算符而不是复制构造函数,因为m已经默认构造。在处理动态内存分配时,默认赋值运算符不够好。您需要实现自己的赋值运算符。我建议你看看What is The Rule of Three?

我还建议您使用像std::vector<std::vector<double>>之类的std::vector,因为编译器提供的默认值对您有效。正如您所说,要求使用double**,您需要自己实现构造函数和赋值运算符。