簡體   English   中英

從函數返回帶有動態字段的對象c ++

[英]return from function, object with dynamic fields c++

我有一個名為Matrix的類,其中包含一個動態存儲的字段。 還有一個名為Multiply()的方法,該方法必須返回2矩陣相乘的結果。 問題是我定義了一個析構函數,當我返回時,存儲結果矩陣的變量會得到一些隨機值,我猜是因為新變量的地址與臨時矩陣相同。 如何正確退貨?

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;
}

有什么想法嗎?

PS我做了副本構造函數,但效果不佳。

這是我制作的副本構造函數。

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;
}

這個:

m = a.Multiply(b);

正在調用賦值運算符,而不是復制構造函數,因為m已被默認構造。 在處理動態內存分配時,默認的賦值運算符將不夠好。 您將需要實現自己的賦值運算符。 我建議您看看什么是“三法則”?

我還建議您只使用2d std :: vector,std::vector<std::vector<double>>因為它與編譯器提供的默認值一樣適合您。 如您所說,使用double**是一個要求,您將需要自己實現構造函數和賦值運算符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM