我试图编写一个能够找到逆矩阵、伴随矩阵等的矩阵类。任意阶的方阵。
构造函数初始化一个 n 阶单位矩阵(传递给它)。
class Matrix
{
int** elements;
int order;
public:
Matrix& operator=(const Matrix& second_inp)
{
if(this->order!=second_inp.order)
cout<<"The matrix cannot be assigned!!!\n"<<this->order<<"\n"<<second_inp.order;
else
{
for(int i=0;i<this->order;i++)
for(int j=0;j<this->order;j++)
this->elements[i][j] = second_inp.elements[i][j];
}
return *this;
}
Matrix operator*(const Matrix& a)const
{
Matrix c(a.order);
for(int i=0;i<c.order;i++)
for(int j=0;j<c.order;j++)
c.elements[i][j]=0;
if (this->order!=a.order)
{
cout<<"The 2 Matrices cannot be multiplied!!!\n";
return Matrix();
}
else
{
for(int i=0;i<a.order;i++)
for(int j=0;j<a.order;j++)
for(int k=0;k<a.order;k++)
c.elements[i][j] += (this->elements[i][k])*(a.elements[k][j]);
return c;
}
}
};
~Matrix()
{
for(int i=0;i<this->order;i++)
delete[] *(elements+i);
delete[] elements;
elements=nullptr;
}
如果我要使用此类运行以下代码:
Matrix exp1(2),exp2(2),exp3(2);
exp1.get_matrix();
exp3=exp1*exp2;
exp3.show_matrix();
我收到运行时错误,在调试时我发现,在乘法(exp1*exp2)之后,如果 * 运算符的结果,= 运算符无法访问数据。
但是,如果我在 main() 末尾使用像这样的手动析构函数来释放所有分配的内存,则程序可以正常工作。
void destroctor()
{
for(int i=0;i<order;i++)
delete[] *(elements+i);
delete[] elements;
}
我如何编辑析构函数或运算符重载来纠正此问题?
我使用的构造函数:
Matrix(int inp_order):order(inp_order)
{
elements=new int*[order];
for(int i=0;i<order;i++)
*(elements+i)=new int[order];
for(int i=0;i<order;i++)
for(int j=0;j<order;j++)
{
if (i==j)
*(*(elements+j)+i)=1;
else
*(*(elements+j)+i)=0;
}
}
很难判断出了什么问题,因为您还没有发布构造函数。
In the exp3=exp1*exp2;
发生了很多事情:
首先在operator*函数中构造一个新的矩阵c。然后return c
;语句调用复制构造函数,然后调用析构函数。之后,operator= 被调用,然后再次调用临时矩阵的析构函数。
我认为发生的情况是您正在使用默认的复制构造函数,它不会进行深层复制。这样析构函数就被调用了return c
删除矩阵之间仍然共享的数据。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)