2013-02-26 2 views
0

행렬 프로그램에 대해 "+"연산자를 오버로드하려고합니다. 여기 내 코드가있어, 나에게 괜찮아 보인다. 그러나 주 기능에 2 개의 행렬을 추가하면 아무 일도 일어나지 않습니다. 누군가 도움을 줄 수 있습니까? 감사합니다 :) BTWC++ overloading : 요소로 행렬을 더하기위한 연산자 +

:

년 - 프로그램을 컴파일하고 행렬에 추가해야하는 지점까지 잘 실행됩니다.

- 나는 문제가 코드의 add (Mtrx, Mtrx) 함수에 테스트를 복사했기 때문에 내 operator +() - function의 구현에 있다고 가정합니다.

//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의 반복은 의심스러워 보입니다. 이것은 의도적입니까, 아니면 0에서 시작한다는 뜻입니까? – kfmfe04

+0

메인()도 붙일 수 있습니까? 연산자 + 확인을 보인다. – Amar

답변

2

당신은 소멸자가 있지만 당신은 복사 생성자와 대입 연산자를 놓치고있어. 엄지 손가락의 규칙으로 그들 중 하나가 있다면 그들 모두를 가져야합니다.

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

명시 적 복사 생성자가 없으면 컴파일러에서 생성합니다. 그것은 스마트하지 않습니다, 그래서 그것은 매트릭스를 복사 할 때 p에 새로운 메모리를 할당하는 것을 모릅니다. 단지 포인터를 복사하기 때문에 원래의 행렬과 복사본이 같은 메모리를 참조하게됩니다. 둘 다 그들의 소멸자가 실행될 때 delete p에 전화 할 것이다. 그것은 나쁜 소식은 두 번째 녀석을위한 곰이다.

정확히 operator+이 돌아오고 res이 복사 될 때 발생합니다.

+0

감사합니다이 문제를 exaclty 것 같습니다. 저는 C++ 초보자이므로 3의 규칙을 구현하는 데 어려움을 겪고 있습니다. 몇 시간 후 몇 시간 후에 새로운 할당 연산자와 파괴자가 작동하지만 복사 생성자는 여전히 작동하지 않는다는 것을 알게되었습니다. :( 'MTRX :: MTRX (CONST가 MTRX 및 m)는 { COUT << "복사 생성자라고!"<< ENDL; 라인 = m.lines; COLS의 =의 m.cols; p는 = 부동 소수점 *의 [ (int j = 0; j 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; 
}