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;
}
而不是使用'double ** val;'使用['std :: vector>'](http://en.cppreference.com/w/cpp/container/vector)。這種方式默認的複製ctor和賦值運算符將爲您工作。 –
NathanOliver
我們需要看到你的析構函數,但我認爲你的問題可能通過實現一個複製構造函數來解決(並且移動構造函數在你的情況下也是有用的)。順便說一句,除非這是爲了學習C++,否則我會強烈建議使用現有的線性代數庫而不是使用自己的容器。 – Sheljohn
這是使用**的一個條件。是的,這是爲了學習:) –