【发布时间】:2011-11-19 15:10:26
【问题描述】:
我正在尝试编写一个矩阵类,它能够找到逆矩阵、伴随矩阵等。任意阶的方阵。 构造函数初始化 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)之后,如果 *operator 的结果,=operator 无法访问数据。
但是,如果我在 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;
}
}
【问题讨论】:
-
您的代码中是否也缺少
elements的分配(而不仅仅是问题中)? -
不,实际代码中没有丢失分配。我在问题中添加了构造函数。
-
是的,我也尝试通过引用返回,但它只是返回一堆警告,说我正在引用已被删除的内存。
-
@Likhit:如果你想要一个完美的程序,你不应该留下任何警告:)
-
向我们展示你的复制构造函数(如果你没有,那就是你的错误)。
标签: c++ matrix operator-overloading destructor