2015-10-03 76 views
0

我有一個名爲Matrix的類,其中包含一個存儲爲動態的字段。而一種名爲Multiply()的方法必須返回乘以2矩陣的結果。問題是我定義了一個析構函數,當我返回時,存儲結果矩陣的變量會得到一些隨機值,我猜這是因爲新變量具有與臨時矩陣相同的地址。我怎樣才能正確地返回它?從函數返回,具有動態字段的對象C++

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

而不是使用'double ** val;'使用['std :: vector >'](http://en.cppreference.com/w/cpp/container/vector)。這種方式默認的複製ctor和賦值運算符將爲您工作。 – NathanOliver

+0

我們需要看到你的析構函數,但我認爲你的問題可能通過實現一個複製構造函數來解決(並且移動構造函數在你的情況下也是有用的)。順便說一句,除非這是爲了學習C++,否則我會強烈建議使用現有的線性代數庫而不是使用自己的容器。 – Sheljohn

+0

這是使用**的一個條件。是的,這是爲了學習:) –

回答

0

此:

m = a.Multiply(b); 

呼喚構建的賦值運算符,而不是拷貝構造函數m已經被默認。默認的賦值運算符不夠好,因爲您正在處理動態內存分配。您將需要實施您自己的分配操作員。我建議你看看What is The Rule of Three?

我也建議你只使用像std::vector<std::vector<double>>一樣的2d std::vector,因爲編譯器提供的默認值可以爲你工作。正如你所說,這是一個需要使用double**,你將需要自己實現構造函數和賦值操作符。