2014-03-05 2 views
0
// The following operator++() represents overloading of pre-increment 
MyIncrDecrClass& operator++() 
{ 
    ++this->m_nCounter; 
    return *this; 
} 

// Passing dummy int argument is to mention overloading of post-increment 
MyIncrDecrClass& operator++(int) 
{ 
    this->m_nCounter++; 
    return *this; 
} 

그래서이 포스트 및 사전 증가 연산자를 구현하는 방법이지만, 내 경우에는 정말 그런 식으로 그것을 구현할 수 없습니다, 그래서 이것은 내가 무슨 짓을 : 아무 잘못이사후 증가 과부하의 중복?

VLongInt& VLongInt::operator++() 
{ 
    ... //BUILD TEMP vector 
    this->vec = temp; 
    return *this; 
} 

VLongInt& VLongInt::operator++(int) 
{ 
    this->vec = this.vec; //seems unnecessary 
    ... //BUILD TEMP vector 
    this->vec = temp 
    return *this; 
} 

있는가 ? 두 가지 모두 같은 방식으로 구현되어야합니다. 헤더 파일 만 달라야합니다. 맞습니까?

+0

는 소리가 난다. 이것은보다 편리하게 http://codereview.stackexchange.com/ –

+1

에 적합 할 수 있습니다. 이것은 모두 증가 연산자가 클래스를 나타 내기를 원하는 대상에 따라 다릅니다. 그러나 그것은 나에게 잘못된 것처럼 보입니다 - 당신의 논쟁은 어느 쪽의 방식 으로든 수정되어야합니다. 그러나 어떤 경우에는 수정 된 버전이 아니라 원래의 것을 돌려 주어야합니다. 그리고 함수 서명을 구별하지 않습니다. 컴파일도 할 수 있습니까? – Floris

+1

두 번째 코드 블록에서는 동일한 이름, 반환 형식 및 매개 변수를 가진 두 개의 함수를 작성했습니다. 어쩌면 나는 C++에 대해 충분히 알지 못하지만, 컴파일러는 어떻게이 두 정의를 구별 할 것인가? –

답변

2

사후 실행 연산자의 오버로드 예제가 잘못되었습니다.

// Passing dummy int argument is to mention overloading of post-increment 
MyIncrDecrClass& operator++(int) 
{ 
    this->m_nCounter++; 
    return *this; 
} 

Intsead는

// Passing dummy int argument is to mention overloading of post-increment 
MyIncrDecrClass operator ++(int) 
{ 
    MyIncrDecrClass tmp(*this); 

    ++this->m_nCounter; 

    return tmp; 
} 

도 문제가 완전히 명확하지 않다가 있어야한다. 사실 동일한 연산자를 두 번 정의했습니다.

VLongInt& VLongInt::operator++() 
{ 
    //... 
    return *this; 
} 

VLongInt& VLongInt::operator++() 
{ 
    //... 
    return *this; 
} 

차이점은 없습니다. 게다가 당신은 당신의 클래스 정의를 보여주지 않았고 그 결과 당신의 문제에 관해서는 아무 것도 말할 수 없었습니다. 그것은 알려져 있지 않습니다.

최소한 자신의 포스트 증가 연산자는 int의 더미 매개 변수로 선언해야한다고 말했듯이. 그리고 임시 객체를 반환해야합니다. 코드가 작동하고 당신은 당신이 잘못 쓴 경우 알고 싶은처럼

VLongInt VLongInt::operator ++(int) 

또는

const VLongInt VLongInt::operator ++(int) 
+0

죄송합니다. VLongInt & VLongInt :: operator ++ (int) – user2967016

+0

@ user2967016 개체 자체를 반환하기 때문에 잘못된 선언입니다. 그래서 당신의 후 증가와 preincrement 운영자 사이에는 차이가 없습니다. –

+1

좋아, 이렇게해야합니까? 이 = 원본; ... this-> vec = temp ... return original? – user2967016

0

틀린가요?

예, 코드에서 ODR (하나의 정의 규칙)을 위반합니다. §3.2/1에 다음과 같이 정의되어 있습니다.

번역 단위에는 변수, 함수, 클래스 유형, 열거 유형 또는 템플릿에 대한 정의가 두 개 이상 있어야합니다.

대신이 두 함수를 정의해야합니다

VLongInt& VLongInt::operator++(); 
const VLongInt VLongInt::operator++(int); 

는 특히, 포스트 증가 연산자 중 하나 const T 또는 T (클래스 타입 인 T 포함)을 반환해야 함을 유의하시기 바랍니다.

+0

정말 필요한 것 (출력을 바꿀 수있는 것)이거나 전문 프로그래머가되어야한다면해야 할 일이 있습니까? – user2967016

+1

@ user2967016, 좋은 코드를 작성하려면 필요합니다. – Shoe

관련 문제