2013-02-26 1 views
-1

유리수에서 작동하고 연산자 오버로딩을 수행하는 클래스를 만들려고합니다. 프로그램의 한 부분 인 입력 스트림에 문제가 있습니다.'int : int'형식의 표현식에서 'std :: istream &'형식의 참조 초기화가 유효하지 않습니다.

예를 들어 "12/8"형식의 입력을 받아야하고 변수 a에 12를 저장하고 변수 b에 8을 저장해야합니다. 여기

내 코드입니다 : 여기

istream& operator>>(istream& In, Rational& Item) 
{ 
    char division_sign; 
    int a,b; 

    In >> a >> division_sign; 
    if (division_sign != '/' || !In.good()) 
    { 
     In.setstate(ios::failbit); 
    } 
    else 
    { 
     In >> b; 
     if (b != 0 || !In.good()) 
     { 
     return Item.numerator_ = a, Item.denominator_ = b; 
     } 
    } 
} 

그리고 오류가 나는 받게된다

In function 'std::istream& operator>>(std::istream&, Rational&)': 
131: error: invalid initialization of reference of type 'std::istream&' from expression of type 'int' 

Line 131return 문을입니다

+0

관련 : http://stackoverflow.com/questions/9825768/safer -c-alternative-to-sscanf/9832875 # 9832875 –

답변

5

당신이 관찰 컴파일 오류가 사실에 기인한다 선언문에 넣은 것과 같은 다른 유형의 값을 반환하려고합니다. 당신은 In하지 b를 반환해야합니다 당신은 그러므로 함수 실행 경로의 가능한 모든 지점에서 istream 객체 참조를 반환해야

return In; 

. 즉, 함수의 끝에는 하나의 return 문만 넣으십시오.

연산자 오버로드에 대해서도 this FAQ을 확인하십시오.

+0

이제이 오류가 발생합니다. 경고 : 제어가 비보안 기능의 끝이됩니다. – Goose

+1

@Goose : 내 두 번째 단락 좀 봐. 특정 형식을 반환하는 함수를 선언하는 경우 항상 해당 형식을 반환 할 수 있어야합니다. – moooeeeep

+0

단락을 다시 읽은 다음 잠시 생각해보십시오. "즉, 함수의 끝에 단 하나의 return 문만 넣으십시오." 읽은 후, 나는 진술서가 어디로 가야 하는지를 알아 냈다. 감사. 왜 사람들이 질문을 downvoted 모르겠 .. – Goose

3

코드에 몇 가지 문제가 있습니다. 먼저 은 함수에서 마지막으로 수행해야 할 작업으로 In을 반환해야하며 In 만 반환해야합니다. return In;은 함수의 맨 마지막 줄이어야하며 이 아니며 함수에서 다른 반환이 있어야합니다. 두 번째로 입력이 성공했는지 확인하지 않고 division_sign에 액세스합니다. 입력이 이미 실패한 경우 failbit을 설정하면 안됩니다. 이 을 만약 당신이 더 이상 문자를 추출하지 않도록

char separator; 
int nominator; 
int divisor; 
in >> nominator >> separator >> divisor; 
if (in && separator != '/') { 
    in.setstate(std::ios_base::failbit); 
} 
if (in) { 
    item = Rational(nominator, divisor); 
} 
return in; 

당신은의 제수를 읽기 전에 구분을 확인 할 수 있습니다 :

은 대략 다음과 같은이 트릭을해야, 말하기, 잘못된. (반면에, 당신은 이미 완전한 int을 추출, 그래서 어쨌든 계속 에 클라이언트에 대한 매우 어려울거야.)

관련 문제