2012-02-03 2 views
1

Я пытаюсь сделать пример (просто пример! Я знаю, что он протекает), чтобы изучить перегрузку оператора на C++, но я получаю значение нуля для элементов суммы .... Я подозреваю, что проблема заключается в конструкторе копирования.Не работает матричный оператор + перегрузка

Детальная реализация ниже:

class Matrix{ 
    public: 
     Matrix(int row, int col); 
     Matrix(const Matrix& src); 
     float& set(int row, int col); 
     float get(int row, int col); 
     const Matrix & operator+(const Matrix& rhs); 

    private: 
     float* data; 
     int nrow; 
     int ncol; 
}; 

Matrix::Matrix(int row, int col){ 
    nrow = row; 
    ncol = ncol; 
    data = new float[nrow*ncol]; 
} 

Matrix::Matrix(const Matrix& src){ 
    nrow = src.nrow; 
    ncol = src.ncol; 
    data = new float[nrow*ncol]; 

    for(int i = 0; i < nrow*ncol; i++){ 
     data[i] = src.data[i]; 
    } 
} 

float& Matrix::set(int row, int col){ 
    return data[row*ncol+col]; 
} 

float Matrix::get(int row, int col){ 
    return data[row*ncol+col]; 
} 

const Matrix & Matrix::operator+(const Matrix& rhs){ 

    if (this->nrow == rhs.nrow && this->ncol == rhs.ncol){ 
     Matrix* m = new Matrix(rhs.nrow, rhs.ncol); 
     for(int i=0; i< nrow*ncol; i++){ 
      m->data[i] = data[i] + rhs.data[i]; 
     } 
     return *m; 
    } else { 
     throw -1; 
    } 
} 

#include <iostream> 

using namespace std; 

int main() 
{ 
    Matrix A(1,1); 
    Matrix B(1,1); 

    A.set(0,0)=1; 
    B.set(0,0)=2; 

    cout << A.get(0,0) << endl; 
    cout << B.get(0,0) << endl; 

    Matrix C = A + B; // Marix C(A+B); 
    cout << C.get(0,0) << endl; 

    return 0; 
} 
+0

Я не вижу деструктора там. Вы нарушаете [правило три] (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three)? –

+0

Я не уверен, почему это не работает, но выделяются две вещи. Этот код пропускает память повсюду. Он должен иметь деструктор для очистки памяти или даже лучше, он должен использовать интеллектуальные указатели для управления памятью. Также вы бросаете int. Всегда лучше всего бросать класс, а наиболее предпочтительно - выводить из std :: exception. – mcnicholls

ответ

5
Matrix::Matrix(int row, int col){ 
    nrow = row; 
    ncol = ncol; 
    data = new float[nrow*ncol]; 
} 

Там опечатка там, что результаты в вашем коде, имеющие неопределенное поведение.

Фикс его:

ncol = col; 

(. Убедитесь, что вы включаете вы компилятор предупреждения/уровень диагностики до максимума, GCC ловит это)

Вы протечка вашего float[] слишком, так что ваш код не является полным. Не забудьте добавить правильные деструкторы и всегда следуйте за rule of three.