2012-04-20 5 views
2

마이너스 (-), 증가 (++) 등을 사용하여 단항 연산자 오버로딩에 대해 읽었습니다. 나는 연습용으로 똑같은 코드를 작성하려고 생각했다. 그러나 그것을 실행하려고했을 때 마이너스와 증분 연산자 모두에 오류가 발생했다. 문제는 내가 메인에서 연산자를 호출하는 방법이라고 생각한다. 누구든지 제발 이 일을하는 올바른 방법은 무엇입니까?C++에서 단항 연산자 오버로드가 어렵습니까?

#include<iostream> 

using namespace std; 

class c{ 
    int x; 
    int y; 
    public: 
     c(int a,int b){ 
      x=a; 
      y=b; 
     } 

     void operator -(){ 
      x=x+1; 
      y=y+1; 
     } 

     void display(){ 
      cout<<x<<" "<<y<<"\n"; 
     } 

}; 

int main() 
{ 
    c obj(2,3); 
    obj.display(); 
     obj- ; //I think the error is on this line 
    obj.display(); 
    return 0; 
} 

obj-를 -obj로 대체하면 코드가 올바르게 작동합니다. 왜 그렇게됩니까? 같은 + + 연산자 오버로드 문제가 있습니다 (++ obj 잘 작동하지만 obj ++ 작동하지 않습니다), 왜?

감사합니다.

+0

오버로드 된 연산자는 값을 반환해야합니다. http://stackoverflow.com/questions/4421706/operator-overloading –

+0

@ThomasMatthews를 참조하십시오. 오버로드 된 운영자에게 가치를 반환해야하는 언어가 아닌 * 관례 *가 명확합니다. 과부하가 걸린 운영자가 '무효'를 반환하는 것은 완벽하고 가능합니다. 그렇게하는 것은 합법적이며 운영자의 특정 용도를 배제합니다. –

답변

4

단항 마이너스 연산자 -은 접두사 연산자입니다.

++ 연산자의 과부하 버전 인 경우 더미 매개 변수가 필요합니다. 예 :

struct foo 
{ 
    void operator -() 
    { 
     std::cout << "hello" << std::endl; 
    } 

    void operator ++ (int) 
    { 
     std::cout << "world" << std::endl; 
    } 
}; 

int main() 
{ 
    foo bar; 
    -bar; 
    bar++; 
} 
+0

도움을 주셔서 감사합니다. –

+3

오버로드 된 증가 연산자는 값을 반환합니다. * 더 효과적인 C++ *, Scott Meyers, ** 항목 6; 증분 및 감소 연산자의 접두사와 접미사 형식을 구별하십시오. "** 참고 자료 : http://stackoverflow.com/questions/4421706/operator-overloading –

+0

@ThomasMatthews 좋은 지적으로서, 나는 연산자의 의미를 보존하는 것이 중요하다는 데 동의합니다. –

1

단항 연산자는 부정 연산자입니다. -5 또는 -var이라고 말하면 어떻게됩니까? 5- 또는 var-을 말하지 않습니다. var - 3 이후라면 이진 연산자를 오버로드하십시오.

postincrement 연산자는 사전 증가 연산자와 구별하기 위해 더미 int 인수를가집니다.

2

먼저 새 연산자를 만들 수 없으며 기존 연산자 만 재정의하면 단항 사후 마이너스를 수행 할 수 없습니다. 사후 감소 연산자는 (물론) 하나뿐 아니라 두 개의 마이너스 기호입니다.

두 번째로 증가 또는 감소 연산자를 정의 할 때 함수를 사용하여 (사용되지 않은) int 인수를 사용하여 사전 형식과 후 양식을 구별합니다. 함수에 인수가있는 경우에는 사후 증가 또는 사후 감소 조작이지만 사전이없는 경우에는 사전 증가/사전 감소입니다.

관련 문제