[英]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.