2010-02-28 4 views
5

좋아, 나는 책을 통해 작업 중이며 C++ 연산자 오버로딩을 배우려고합니다. 생성자에 대해 단일 int (처음에는 0으로 설정)를 사용하는 BigInt 클래스를 만들었습니다. 나는 + = 메소드를 오버로드하고 다음과 같은 코드에서 잘 작동합니다 :C++에서 연산자 + 오버플로

BigInt x = BigInt(2); 
x += x; 
x.print(cout); 

코드를 출력 4. 그래서, 나는 다음과 같은 코드 글로벌 연산자를 오버로드 + 사용하여 작업을했다 :

BigInt operator+(const BigInt lhs, const BigInt rhs) 
{ 
    BigInt returnValue(lhs); 
    returnValue += rhs; 
    return returnValue; 
} 

이것은 또한 다음과 같은 코드를 잘 작동 : 나는 다음과 같은 코드를 실행하려고 할 때이, 그러나 6을 출력

BigInt x = BigInt(1); 
BigInt y = BigInt(5); 
BigInt z = x + y; 
z.print(); 

, 그냥 작동하지 않습니다. 이 책은 잘 설명하지 못하고 간단히 작동해야 함을 의미합니다.

BigInt x = BigInt(1); 
BigInt z = x + 5; 
z.print(); 

이 z는 1 왜 내가 온라인과 유래에 인터넷 검색 6.해야하지만 정확히 같은 문제가 된 그 다른 사람을 찾을 수있을 때 잘 모르겠어요 1. 출력합니다. 일부는 가깝지만 대답은 적합하지 않았습니다. 어떤 도움을 많이 주시면 감사하겠습니다!

+4

나는 이것이 당신의 문제와 관련이 있다고 생각하지 않지만 효율성을 위해서 (그리고 C++에서 관용적이기 때문에)'operator +'에 대한 인수는 값이 아니라 const 참조에 의해 취해 져야한다. 'BigInt operator + (const BigInt & lhs, const BigInt & rhs) ' –

+3

계속 궁금해하는 한가지 :'= 1' 대신에'BigInt (1)'을 쓰는 이유는 무엇입니까? 우리가 완전한 클래스 정의를 보여준다면, 우리는 당신을 더 잘 도울 수 있다고 생각합니다. –

+1

나는 Tyler에 동의합니다. 또한 BigInt x (1);로 초기화하는 관용적 인 방법 당신이하고있는 방식은 일시적으로 생성 된 다음 복사본 ctor를 호출합니다 (그래도 아마 최적화 될 것입니다). – Dan

답변

3

대부분의 문제는 += 연산자에 있습니다. 그것을위한 포스트 코드.

+0

@Johannes Schaub은 암시 적 캐스팅 (breakpoints 및 코드 추적이 많이 발생하여 하나를 찾았 음)으로 변환되고 있다고 말했을 때 맞았습니다. 문제는 실제로 + = 연산자에있었습니다. 나는 그 이전의 코멘트와 @aaa의 도움으로 그것을 알아 내지 못했습니다. 모두 감사합니다! –

2

BigInt에 int를 추가하려면 오버로드가 필요합니다. 예제에서 상수 5는 BigInt가 아닌 int 유형입니다. 이 같은 것이 작동해야합니다.

BigInt operator+(const BigInt lhs, const int rhs) 
{ 
    BigInt returnValue(rhs); 
    returnValue += lhs; 
    return returnValue; 
} 

operator+(const int lhs, const BigInt rhs)도 하나 일 수 있습니다.

+4

컴파일 된 코드는'BigInt' 로의 변환이 암시 적 변환의 방식으로 이루어 졌음을 의미합니다. 왜 코드가'1'을 컴파일하고 출력해야합니까? 그건 나에게 의미가 없다. –

+0

예, 'int'를 취하는 즉,'int'에서'BigInt' 로의 변환을 제공하는 비 - 명시 적 생성자가 없으면'operator +'의 세 가지 오버로드가 필요합니다. @kevingessner,'int' 앞에있는'const'는 매개 변수 목록에서 쓸모가 없습니다. 반대로 반환 유형은 'a + b = c;'와 같은 말도 안되는 것을 막기 위해 아마도'const BigInt'이어야합니다. –

+0

위의 해결 방법을 시도했지만 여전히 동일한 대답을 얻었습니다. –

0

게시 한 코드가 정상적으로 작동하고 작동해야합니다. 보이는 문제는 BigInt 클래스의 복사 생성자 또는 대입 연산자 때문일 것입니다.

1

슈퍼 간단한 코드 (I 유효한 독립 실행 형 실행 프로그램으로 모든 코드를 포함하는 추가하고 그것을 만들 수있는 최소) 다음

#include <iostream> 

class BigInt 
{ 
    public: 
    BigInt(int i): _i(i) {} 
    void print() { std::cout << "BigInt(" << _i << ")\n"; } 
    void operator +=(const BigInt rhs) { _i += rhs._i; } 
    private: 
    int _i; 
}; 

BigInt operator+(const BigInt lhs, const BigInt rhs) 
{ 
    BigInt returnValue(lhs); 
    returnValue += rhs; 
    return returnValue; 
} 

int main() { 
    BigInt x = BigInt(1); 
    BigInt y = BigInt(5); 
    BigInt z = x + y; 
    z.print(); 

    BigInt ax = BigInt(1); 
    BigInt az = ax + 5; 
    az.print(); 

    return 0; 
} 

를 방출 예측 등 :

BigInt(6) 
BigInt(6) 

관찰 한 버그를 재현하기 위해이 작업 코드를 최소한으로 변경하십시오. 물론 버그가있는 곳을 분명히 보여줄 것입니다.