2012-05-12 6 views
1

Project Euler 챌린지에서 사용하기 위해 매우 큰 숫자를 처리하는 클래스를 만들기 위해 노력하고 있습니다. 나는 클래스와 함께 작동하기 위해 < <과 +를 오버로드했다. 다음 컴파일하고 제대로 작동 :오버로드 된 멤버 함수 오버로드 된 보내기 결과 << 컴파일 오류가 발생합니다

BigNum a(400000000); 
BigNum b(400000000); 

cout << (a + b); 

오류는 다음과 같습니다 : 오류 :

BigNum a(400000000); 
BigNum b(400000000); 
BigNum c; 

c = a + b; 

cout << c; 

다음은 컴파일 오류가 발생하지 않습니다 '연산자 < <'에 대한 일치를 표준 '에 :: < < COUT 연산자의 bignum : + (CONST은 &의 bignum) 여기 CONST (((CONST의 bignum &) ((CONST의 bignum *) (& b)))) "참조 용

이다

/* BigNum.h */ 

#include <iostream> 
#include <vector> 

class BigNum { 
public: 
BigNum(); 
BigNum(const BigNum &src); 
BigNum(int num); 
void print(std::ostream *os); 

public: 
BigNum &operator=(const BigNum &src); 
BigNum &operator+=(const BigNum &src); 
const BigNum operator+(const BigNum &src) const; 

private: 
bool negative; 
std::vector<int> digits; 
}; 

std::ostream &operator<<(std::ostream &os, BigNum &bNum); 

/* BigNum.cpp */ 

#include "BigNum.h" 

BigNum::BigNum() { 
digits.push_back(0); 
} 

BigNum::BigNum(const BigNum &src) { 
digits = src.digits; 
} 

BigNum::BigNum(int num) { 
if(num == 0) { 
    digits.push_back(0); 
} 
else { 
    while(num != 0) { 
     digits.push_back(num % 10); 
     num /= 10; 
    } 
} 
} 

void BigNum::print(std::ostream *os) { 
int i; 

for(i = digits.size() - 1; i >= 0; i--) { 
    *os << digits[i]; 
} 
} 

std::ostream &operator<<(std::ostream &os, BigNum &bNum) { 
bNum.print(&os); 
return os; 
} 

BigNum & BigNum::operator=(const BigNum &src) { 
if(this == &src) return *this; 

digits = src.digits; 

return *this; 
} 

BigNum & BigNum::operator+=(const BigNum &src) { 
int carry, i, k; 

carry = 0; 

if(digits.size() < src.digits.size()) { 
    digits.resize(src.digits.size(), 0); 
} 

{ 
    k = src.digits.size(); 
    for(i = 0; i < k; i++) { 
     digits[i] += src.digits[i]; 
     digits[i] += carry; 
     carry = 0; 
     if(digits[i] > 9) { 
      carry = 1; 
      digits[i] -= 10; 
     } 
    } 

    k = digits.size(); 
    for(i = src.digits.size(); i < k; i++) { 
     digits[i] += carry; 
     carry = 0; 
     if(digits[i] > 9) { 
      carry = 1; 
      digits[i] -= 10; 
     } 
    } 

    if(carry) { 
     digits.resize(digits.size() + 1, 1); 
    } 
} 

return *this; 
} 

const BigNum BigNum::operator+(const BigNum &src) const { 
BigNum result(*this); 
result += src; 
return result; 
} 

cout << (a + b); 

이 작동하지 않습니다 클래스 정의 및 구현? 명백한 해결 방법이 있지만 왜 이런 일이 일어나는지 이해하고 싶습니다. 나는 C++을 처음 사용하기 때문에, 내가 잘못하고 있거나 더 잘할 수있는 일이 있다면 알려 주시기 바랍니다. 고맙습니다.

답변

2

operator<<의 과부하에는 const BigNum 해당 operator+가 반환되지 않습니다. operator<<의 매개 변수 유형을 const BigNum &으로 변경하십시오.

이 함수는 전달 된 객체를 수정할 수 있다고 생각하지만 수정할 수없는 객체를 전달하므로 일치하지 않습니다.

마찬가지로 아래에서 지적한대로 print() 함수는 const이어야합니다.

+1

+1 잡기. 그러나 그들은'print' 멤버 함수를 const로 만들 필요가 있습니다. – juanchopanza

+0

@ juanchopanza, 그걸 잡아주지 않았다, 고마워. – chris

+0

감사합니다. 그게 문제를 해결 한 것 같습니다. – vanGogh92

관련 문제