2013-02-26 1 views
0

Я пытаюсь перегрузить оператор «+» для программы Matrix. Вот мой код, мне все хорошо. Но когда я добавляю две матрицы в свою основную функцию, ничего не происходит. Может кто-нибудь помочь? спасибо :)Перегрузка C++: оператор + для добавления матриц по элементу

BTW:

-Программа компилирует и не работает нормально до того момента, когда он должен добавить в матрицах.

-I предполагаю, что проблема заключается в реализации моего оператора +() - функции, потому что я скопировал код в функцию add (Mtrx, Mtrx), чтобы проверить, и это тоже не сработало.

//Mtrx.h

#ifndef MTRX_H_ 
#define MTRX_H_ 
#include <iostream> 
#include <string> 

using namespace std; 
using std::ostream; 

class Mtrx { 
    int lines,cols; 
    float **p; 
public: 

    Mtrx(); 
    Mtrx(int,int); 
    int getLines(); 
    int getCols(); 
    float getElement(int,int); 
    void setLines(int); 
    void setCols(int); 
    void setElement(int,int,float); 

    Mtrx operator+(Mtrx&); 

     ~Mtrx(); 
}; 

ostream& operator<<(ostream& os, Mtrx& m); 

#endif /* MTRX_H_ */ 

//Mtrx.cpp

//... 
//... 
Mtrx::~Mtrx(){ 
delete p; 
p = NULL; 
} 

Mtrx Mtrx::operator+(Mtrx& m){ 
if(this->getLines() == m.getLines() && this->getCols() == m.getCols()){ 
    Mtrx res(getLines(),getCols()); 

    for (int i = 1; i <= this->getLines(); i++){ 
     for(int j = 1; j <= this->getCols(); j++){ 
      res.setElement(i,j,(this->getElement(i,j)+m.getElement(i,j))); 
     } 
    } 

    return res; 
} 
+0

Ваши итерации из '1..nLines' и' 1..nCols' выглядят подозрительными. Является ли это намеренным или вы хотели начать с нуля? – kfmfe04

+0

Можете ли вы вставить свой основной(), а? оператор + выглядит нормально. – Amar

ответ

2

У вас есть деструктор, но вам не хватает конструктор копирования и оператор присваивания. Как правило, если у вас есть какой-либо из них, у вас должно быть все.

Mtrx(const Mtrx&); 
Mtrx& operator=(const Mtrx&); 
~Mtrx(); 

Без явного конструктора копирования компилятор будет генерировать один для вас. Однако он не умный, поэтому он не знает, чтобы выделить новую память для p, когда он копирует матрицу. Он просто копирует указатель, в результате чего исходная матрица и копия ссылаются на одну и ту же память. Оба они назовут delete p, когда их деструктор работает, и это плохая новость для второго парня.

Это именно то, что происходит, когда operator+ возвращается и res копируется.

+0

Спасибо, это, похоже, проблема. Я начинающий C++, поэтому у меня возникают трудности с выполнением правила трех. Через часы и часы я установил, что мой новый оператор назначения и destrucor работают, но мой конструктор копирования до сих пор не работает. :( 'MTRX :: MTRX (Const MTRX & м) { соиЬ << "Конструктор копирования называется!" << епсИ; линии = m.lines; COLS = m.cols; р = новый поплавок * [ строки]; для (int i = 0; i user2109467

+0

извините о форматировании, я хуже. при этом, чем я на C++. – user2109467

0

Проверьте свои фигурные скобки. У вас либо отсутствует один, либо ваш путь управления для if (false) не возвращается.

Mtrx Mtrx::operator+(Mtrx& m){ 
if(this->getLines() == m.getLines() && this->getCols() == m.getCols()){ 
    Mtrx res(getLines(),getCols()); 

    for (int i = 1; i <= this->getLines(); i++){ 
     for(int j = 1; j <= this->getCols(); j++){ 
      res.setElement(i,j,(this->getElement(i,j)+m.getElement(i,j))); 
     } 
    } 

    return res; 
} 

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

  • Нет связанных вопросов^_^