如何打印添加功能的结果..?

时间:2013-11-17 13:50:11

标签: c++ class

我想将结果对象传递给另一个显示函数,但由于某种原因它无法正常工作。 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];
}
}
}

3 个答案:

答案 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;  
   }

但它仍然不是很好,在此功能之后,结果将被删除