我想将结果对象传递给另一个显示函数,但由于某种原因它无法正常工作。 cmd停止工作
我尝试使用不同的aproaches但似乎没有工作.. 基本上我可以使用函数添加两个矩阵,返回类型应该是一个对象。我想打印这个添加的结果,而不是在这个函数中,而是使用另一个函数。
#include<iostream>
using namespace::std;
class Matrix{
private:
int row,column; //dimensions row x column
int **matrix; //pointer to a pointer to int
void allocarray(){ //method to llocate array matrix and the matrix[i] arrays
matrix=new int*[row];
for(int i=0;i<row;i++){
matrix[i]=new int[column];
}
}
public:
Matrix(int rowsize, int columnsize); //default constructor
Matrix(); //user defined constructor
~Matrix(); //destructor
void input();
Matrix Add(Matrix);
void display(Matrix);
};
Matrix Matrix::Add(Matrix m2)
{
Matrix result(3,3);
for(int i=0;i<row;i++)
{
for( int j=0;j<column;j++)
{
result.matrix[i][j]=this->matrix[i][j]+m2.matrix[i][j];
}
}
return *this;
}
void Matrix::display(Matrix m)
{
for(int i=0;i<row;i++)
{
for( int j=0;j<column;j++)
{
cout<<m.matrix[i][j];
}
cout<<endl;
}
}
Matrix::Matrix( int rowsize, int columnsize):row(rowsize),column(columnsize) //dynamivally allocate
{
allocarray();
for(int i=0;i<row;i++)
{
for( int j=0;j<column;j++)
{
matrix[i][j]=0; //initilze all values to 0
}
}
}
Matrix::~Matrix() //destructor
{
for( int i=0;i<row;i++)
{
delete [] matrix[i];
}
delete [] matrix;
}
void Matrix::input()
{
cout<<"enter the elements for the matrix"<<endl;
for(int i=0;i<row;i++)
{
for(int j=0;j<column;j++)
cin>>matrix[i][j];
cout<<"\n"; //check it after performing functions!
}
}
int main()
{
Matrix obj1(3,3),obj2(3,3),res(3,3);
cout<<"enter elements for matrix one";
obj1.input();
cout<<"enter elements for matrix two";
obj2.input();
cout<<"addition of two matrices";
res=obj1.Add(obj2);
obj1.display(res);
return 0;
}
所以这里是复制构造函数的代码
Matrix::Matrix(const Matrix &m):row(m.row),column(m.column)
{
allocarray();
for(int i=0;i<row<i++)
{
for(int j=0;j<column;j++)
{
matrix[i][j]=m.matrix[i][j];
}
}
}
答案 0 :(得分:1)
您的类没有定义复制构造函数或赋值运算符。但是,任何将矩阵传递给函数或从函数返回矩阵的尝试都会复制矩阵。您的代码失败,因为析构函数释放了仍在使用的内存。在编写手动管理内存的类时,必须遵循rule of three。这样做,你的程序就可以了。
同样,Patato表示您需要将return result;
添加到Matrix::Add
,但除非您遵守三条规则,否则也会失败。
编辑:将链接更改为指向规则为3的Stack Overflow页面,这比Wikipedia页面更有帮助。
编辑:这是这个类的示例复制构造函数,它与常规构造函数非常相似
Matrix::Matrix(const Matrix& rhs):row(rhs.row),column(rhs.column)
{
allocarray();
for(int i=0;i<row;i++)
{
for( int j=0;j<column;j++)
{
matrix[i][j]=rhs.matrix[i][j];
}
}
}
答案 1 :(得分:0)
您可以传递对该函数的引用(并返回一个):
Matrix& Add(Matrix&);
或编写复制构造函数,以便稍后可以使用实际矩阵。
此外,您不应该返回您要添加的矩阵,而是result
:
Matrix& Matrix::Add(Matrix &m2)
{
Matrix *result = new Matrix(3,3);
for(int i=0;i<row;i++)
{
for( int j=0;j<column;j++)
{
result->matrix[i][j]=this->matrix[i][j]+m2.matrix[i][j];
}
}
return *result;
}
答案 2 :(得分:0)
使用引用是好的,并且你的add函数不会返回添加结果 所以它看起来像这样
Matrix Matrix::Add(Matrix &m2)
{
Matrix result(3,3);
for(int i=0;i<row;i++)
{
for( int j=0;j<column;j++)
{
result.matrix[i][j]=this->matrix[i][j]+m2.matrix[i][j];
}
}
return result;
}
但它仍然不是很好,在此功能之后,结果将被删除