2012-04-06 5 views
0

나는 연산자 오버로딩의 주위에 내 머리를 얻기 위해 고군분투하고있다. 이 경우에는 + 연산자와 제가 시도한 예제를 통해 도움을 얻을 수 있습니다.연산자 오버로딩 C++ 조언

나는 '클래스 매트릭스'나는이 두 행렬을 추가하는 방법이 문제를 해결하는 방법에 대한 확신이 오전의 "invaild 사용이 함께 객체라는 오류는 무엇입니까?

Matrix Matrix::operator+(const Matrix& rhs){ 
return Matrix(Matrix + rhs.Matrix()); 
} 


    Matrix::Matrix(int MM, int NN){ 
        M = MM; 
        N = NN; 
        data = new double[M * N]; 
        for (int i =0; i < M; i++) 
        { 
         for (int j = 0; j < N; j++) 
         { 
          data[i* N+j] = (double) 1000 + i*N+j; 
        //  cout << data[i*N+j] <<"\t"; 
         } 
         //cout <<"\n"; 
        } 

     cout << "Matrix Constructor... (code to be implemented here!!!)\n";} 

감사

+1

질문은 무엇인가? – Christian

+0

연산자 오버로딩에 대한 좋은 정보 http://courses.cms.caltech.edu/cs11/material/cpp/donnie/cpp-ops.html – Marius

답변

1

JPM의 대답은보기 위하여 매우 중요하다. 이 문제를 해결하면 내 것을 볼 수 있습니다.

본질적 연산자 과부하는 다른 기능 다르지 않다.

그래서의 경우 :

당신이 정말로이 말하는 무슨 일을하는지
Matrix Matrix::operator+(const Matrix& rhs) 

: 현재 행렬에 우를 추가하고, 새로운 행렬을 반환합니다. 오버로드로 인해 현재 매트릭스가 변경되지 않아야합니다. 자신을 도움말 및 상수를 사용

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

그와 같은 매트릭스 또한 먼저 행렬은 크기가 동일한 경우에 당신이 그들을 모두 "세포"를 통해 함께 다음 루프를 추가하고 추가 할 수 있도록 확인하고 작성해야 그것의 매트릭스. 이를 위해, 내가 두 번째 생성자가 필요합니다 같은데요, 뭔가 같은 :

Matrix::Matrix(int MM, int NN, double values[]) 
{ 
    M = MM;//TODO: change to width 
    N = NN;//TODO: change to height 
    data = new double[M*N]; 
    for(int i < 0; i < M; i++) 
     for(int j < 0; j < N; j++) 
      data[i * N+j] = values[i * N+j]; 
} 
+1

조금만 명확히하기 위해. "현재 행렬에 rhs를 더한다"고 말하면 현재 행렬의 값을 변경하지 않습니다. 이 연산자는 현재 행렬의 상태에 영향을 미치지 않아야합니다. 대신이 행렬의 값을 rhs의 값에 더하고 모든 결과를 새로운 행렬에 넣기를 원합니다. 그냥 분명히. – jpm

+0

@jpm 맞아요. – MPelletier

4
    방법은
  1. 매우 불법처럼
  2. 는 생성자를 호출Matrix
  3. 입니다, Matrix은 식별자가 아닙니다
  4. 식별자를 정리하면 *this + rhsthis->operator+(rhs)과 같습니다. 여기에서 한 것은 무한 재귀를 만드는 것임을 분명히해야합니다.
+1

생성자 코드를 보지 않았으므로 해석하지 마십시오. 이 목록에서 그것의 타당성의 나의 승인. – jpm

+1

또한, 생성자에서'new'를 사용하여 힙 메모리를 통해'data' 멤버를 관리하고 있기 때문에 (아마도 여러분의 소멸자에서 상응하는'delete'), 당신은 적절한 깊이를 갖는 복사 생성자와 대입 연산자를 정의해야합니다 C++에서 제공하는 기본 데이터와 같이 데이터의 복사본은 동일한'data' 포인터 (복사 된 경우)를 참조하고 복사본에 포인터 문제가 매달려있는 여러 'Matrix'인스턴스와 같은 문제를 유발할 수 있습니다. –

+0

'Matrix'는 식별자입니다. 단지 변수 이름이 아니라 형식 이름입니다. –

0
return Matrix(Matrix + rhs.Matrix()); 
       ^^^^^^  ^^^^^^ 

당신은 표현이 있어야한다 유형 이름 (Matrix)를 사용하는 - 즉, 컴파일러는 무엇 에 대해 불평. 또한 무효 인 기존 객체에 대해 생성자를 호출하려고합니다. 또한 자신을 호출하는 방식으로 operator+을 구현하려고 시도하는 것 같습니다. 어떻게 든 컴파일하면 무한 재귀로 인해 스택 오버플로가 발생합니다. 이것은 정확한 복사 생성자가 당신을 필요로 않습니다

Matrix & Matrix::operator+=(Matrix const & rhs) { 
    // Perform addition here 
    for (int i = 0; i < N*M; ++i) { 
     data[i] += rhs.data[i]; 
    } 
    return *this; 
} 

// This can be a non-member function 
// Pass "lhs" by value to get a copy, then modify and return that. 
Matrix operator+(Matrix lhs, Matrix const & lhs) { 
    return lhs += rhs; 
} 

// Or if you really want a member function for some reason 
Matrix Matrix::operator+(Matix const & rhs) const { 
    return Matrix(*this) += rhs; 
} 

:

아마도 추가를 구현하는 가장 쉬운 방법은 기존에 하나의 매트릭스를 추가 operator+=을 구현하고 그 측면에서 operator+을 구현하는 것입니다 - 당신이 소멸자에서 할당을 해제 아마 생성자에서 메모리를 직접 할당하고있어 이후, 당신 그렇지 않으면 당신은 이중 삭제 후를 얻을 수 있습니다 올바르게합니다 (Rule of Three 당) 새로운 메모리를 할당하기 위해 복사 생성자를 구현해야합니다 행렬 복사.