2014-12-11 2 views
0

r--; 내 개체 값을 0으로 다시 설정합니다. 어떤 아이디어?연산자 오버로드 (-)는 변수를 0으로 설정합니다.

class MyClass : Superclass { 
private: 
    int length; 
    int width; 

public: 
    MyClass() { 
     length = 0; 
     width = 0; 
    } 

    MyClass (int x, int y):Superclass(x/2,y/2){ 
     length = x; 
     width = y; 

    } 

    MyClass operator--(int) { 
     MyClass temp = *this; 
     temp.length --; 
     temp.width --; 
     return temp; 
    }; 
}; 

작성 및 클래스를 시도 :

MyClass *r = new MyClass(2,3); 
r--; // now length and width = 0 (should be 1,2) 
+5

'r -'는 포인터를 감소시키고 있으므로'r'은 할당 한 객체를 가리 키지 않습니다. 그것을 가리키는 것을 사용하거나 보려고하면 정의되지 않은 동작이 발생합니다. –

+2

운영자는 복사본에있는 것이 아닌'this-> length'와'this-> width'을 수정해야합니다. postfix 연산자는'this'를 수정하고 이전에 객체 상태의 복사본을 반환해야하므로'temp.length -;'를'length -;'로 대체하고'width'를 위해서는 ditto를 사용해야합니다. – cdhowie

+0

진술 :'MyClass :: operator -()'로'MyClass :: operator - (int)'를 구현해야합니다. – Deduplicator

답변

6

첫째로, 운영자가가 불리는 객체를 감소하지 않지만, 사본은 반환 할 것입니다. 그것은 혼자두고 (이전 값을 반환하는) 및 오브젝트 감소한다 :

MyClass temp = *this; 
this->length--; // this-> is optional 
this->width--; 
return temp; 

둘째, r는 포인터입니다. r--은 가리키는 객체가 아니라 포인터를 감소시켜 유효하지 않은 메모리 위치를 가리 키도록합니다. 이후에이를 역 참조하면 정의되지 않은 동작이 발생합니다.

이유가 여기에 new을 사용하고 있는지 잘 모르겠습니다. 당신이 정말로 어떤 이유로 포인터를하고자 할 경우

MyClass r(2,3); 
r--; // should behave as expected. 

, 당신은이 물체 얻는 역 참조 할 것 :

(*r)--; 

을하고 잊지 마세요 당신은 거의 확실 단지 변수를 원하는 일단 개체를 삭제하면 개체를 삭제할 수 있습니다. 그리고 전에.

+2

'operator - (int)'가'* this'가 아닌'temp'를 수정하기 때문에 여전히 작동하지 않습니다. –

+0

@JonathanWakely : 좋은 지적, 나는 그 점을 발견하지 못했습니다. –

+0

C++을 배우는 것만으로도 오버로딩에 대해 확신 할 수 없습니다 ... 더 좋은 방법이 있나요? –