2013-11-17 4 views
0

Я хочу передать объект результата другой функции отображения, но по какой-то причине он не работает. 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]; 
} 
} 
} 
+4

Ваша матрица управляет ресурсами, так что вы должны следовать [правилу трех] (HTTP: // ан .wikipedia.org/wiki/Rule_of_three_% 28C++ _ programming% 29) или используйте некоторый класс хранения, который выполняет управление для вас. – juanchopanza

ответ

0

с помощью ссылки хорошо, и ваша функция добавить не возвращает результат добавления так выглядит как этот

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

, но это еще не очень хорошо, после этой функции результат будет удален

+0

Я ищу, чтобы вернуть результат в main, а затем передать его функции отображения, которая была вызвана с obj1, и финализировать ее в соответствующей матричной форме. – user3001571

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; 
    } 
+0

Ваша версия утечки памяти. Определение конструктора копии не является обязательным для такого класса. – john

1

Ваш класс не защиту ine - конструктор копирования или оператор присваивания. Но любая попытка передать матрицу функции или вернуть матрицу из функции копирует матрицу. Ваш код не работает, потому что деструктор освобождает память, которая все еще используется. При написании классов, которые вручную управляют памятью, вы должны следовать за rule of three. Сделайте это, и ваша программа будет работать.

Также как Patato сказал, что вам нужно добавить return result; в Matrix::Add, но это также потерпит неудачу, если вы не выполните правило из трех.

EDIT: изменилась ссылка, чтобы перейти на страницу переполнения стека по правилу три, что гораздо более полезно, чем страница Википедии.

EDIT: вот конструктор пример копирования для этого класса, он очень похож на регулярный конструктор

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]; 
     } 
    } 
} 
+0

МОЖЕТЕ помочь мне с кодом ..? Я знаю концепцию конструктора копирования, я написал код для него, но dnt знаю, чтобы реализовать его в этом коде ... Я застрял с ним frm последние 2 часа – user3001571

+0

@ user3001571 См. обновление, в этом случае конструктор копирования очень похоже на конструктор, который вы уже написали. Не забывайте, что вам тоже нужно выполнить оператор присваивания. Если вы следуете за иконами копирования и обмена (объясняется здесь http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom), это тоже очень просто. – john

+0

Я сделал то же самое ... мне нужно что-то изменить в функции добавления.? – user3001571

Смежные вопросы