我想寫一個矩陣類,它將能夠找到逆,伴隨等。任何次序的方陣。 構造函數初始化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;
}
}
遵循三的規則。 –
您的代碼中是否也包含「元素」的分配(而不僅僅是在問題中)? – eran
在實際的代碼中沒有分配不會丟失。我在該問題中添加了構造函數。 – Likhit