我试图写一个矩阵类,它能够找到逆,伴随等。任何顺序的方阵的。 构造函数初始化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;
}
}
答案 0 :(得分:3)
很难说出现了什么问题,因为你还没有发布你的构造函数。
在exp3=exp1*exp2;
中发生了很多事情:
首先在operator *函数中构造一个新的矩阵c。然后是return c
;语句调用复制构造函数,然后调用析构函数。之后调用operator =,然后再次调用临时矩阵的析构函数。
我认为发生的情况是您使用的默认复制构造函数不能生成深层复制。这样,在return c
时调用的析构函数会删除仍然在矩阵之间共享的数据。
答案 1 :(得分:0)
我得到一个运行时错误,而调试我发现,在乘法(exp1 * exp2)之后,如果*运算符的结果,=运算符无法访问数据。
您没有向我们展示您的构造函数,因此无法告诉您为何会出现此错误。
我怀疑原因是你没有分配包含矩阵所需的内存。您将其声明为int**
,因此您需要分配一个int*
指针数组,并为每个指针分配一个int
数组。
修改强>
当我输入这个时,你发布了构造函数的代码。
您没有从operator*
的重载中返回值,并且您没有复制构造函数(规则为3)。
您是否启用了编译器警告?任何值得盐的编译器都会抱怨运算符重载中缺少return语句。
答案 2 :(得分:0)
您尚未定义复制构造函数,因此编译器将为您生成一个。将调用此构造函数,以便将operator*(const & Matrix a)
的返回值复制到结果中。
由于生成的复制构造函数只执行浅成员复制,因此不会分配新的元素数组,因此会出错。