2013-07-01 3 views
-1

다음 질문에 대한 답을 제시합니다.
나는 클래스 매트릭스동적으로 할당 된 객체에 대한 참조 반환

class Matrix{ 


    private: 

     int *array; 
     int x; 
     int y; 

    public: 

     //some other things.. 
     Matrix& operator+(Matrix& add); 
     Matrix& operator=(Matrix& matr); 

} 

내가 연산자 + 개체를가 매트릭스 할당됩니다 완전히 새로운 객체, 매트릭스에없는 매트릭스를 참조하거나 포인터를 반환 할 수 있습니다. 연산자 =는 값을 비트 단위로 복사합니다.

는 (나는 Matrix 클래스의 구현이 좋지 않은 것을 알고 있지만 나는 내 문제를 설명하기 위해 다음과 같이 그것을 확인)

지금 문제가

먼저 내가를 만들려고 + 연산자의 구현 이

Matrix sum; 
//do what i have to do and then 
return sum; 

같은 오버로드 된 함수 객체 그러나 이것은 물론 파괴하는 오브젝트의 합과 매트릭스의 소멸자 것이다 물론

같은 문제를 제공합니다 6,
delete [] array;  

대안으로 이제

Matrix *sum; 

sum = new Matrix; 

sum->array = new int[//size that i need]; 
//do what i have to do 

return *sum; 

를 생성하는 메인

C=A+B; 

(A, B, C는 매트릭스 객체)

A + B가 새롭게 생성 반환 힙에있는 객체에 대한 참조. 이 개체는 C에 할당되고 비트 단위로 복사본이 생성됩니다. C에는 올바른 x 값, 올바른 y 값이 있고 C-> 배열은 오버로드 된 연산자에서 할당 된 int 배열을 가리 킵니다 +

마지막이의 할당은 이후 난 메모리가 될 것이다 누출 미칠 은 (는 sizeof (매트릭스)) 라인

sum = new Matrix; 

에서 연산자 + 함수에 할당 된 바이트 그래서 답변을 원하는 내가 어떻게 나타낸다 두 번째 경우의 메모리 누수를 피할 수 있습니다.

구현이 좋지 않다고 되풀이하지만 내가 가진 문제를 보여 주기만했습니다. 또한 내가 메인에 매트릭스에 대한 포인터를 가지고 모든 매트릭스 함수는 매트릭스 포인터를 반환 할 수 있습니다. 이것은 많은 문제를 해결할 수 있지만이 특정 경우에 대한 해결책을 원합니다.

+2

'연산자 +'새로운 객체가 아니라 참조를 반환해야합니다. – juanchopanza

답변

1

operator +는 매트릭스 &이 아닌 Matrix를 반환해야합니다. 후자를 잊어 버려.

항목 21 자세한 내용은 Scott Meyers의 Effective C++를 참조하십시오.

A fraction here

3

operator+에 대한 적절한 프로토 타입은

Matrix operator+(Matrix add); 

이며, 가능한 경우, operator+=를 사용하여 구현한다 : 당신이이기 때문에 add이 값에 의해 전달되는

{ 
    add += *this; //or just the logic if += isn't implemented 
    return add; 
} 

하는 것으로 어쨌든 수정합니다 (새로운 Matrix을 만드는 것과 반대 됨) -이 나뭇잎 최적화를위한 공간.

대안없는 기능은 다음과 같습니다

Matrix operator+ (Matrix mat1, const Matrix& mat2) 
{ 
    mat1 += mat2; 
    return mat1; 
} 
+0

무료 기능과 회원 기능간에 차이가 있음에 유의하십시오. 이 경우, 덧셈은 교환 가능하다고 가정 할 수 있지만, 일반적인 경우에는 보류가 필요하지 않습니다 (따라서 참조에 의해'add'를 실제로 전달하고'* this'를 복사하여 피연산자 순서를 얻을 수 있습니다) . – bitmask

관련 문제