2013-07-02 4 views
0

나는 ++ 클래스와 C의 연산자 오버로딩과 주변에 땜질 된 한 - 최근 내가 코드를 건너 왔어요 난에 과부하 '< <'모두연산자 오버로드는 두 가지 방법으로 작동합니다.

cout << class_object 

class_object << cout 

일 경우 어떤에서 연산자 (개별 클래스 멤버를 반환). 내 클래스 멤버 int num 및 멤버 함수를 가지고

ostream& operator << (ostream& os) 
{ 
    os << num; 
    return os; 
} 

다음 함수는 클래스 외부에서 정의 -

ostream& operator<<(ostream& os, X &class_object) 
{ 
    return class_object << os ; 
} 

(가정하여 X 클래스가)

작동 왜 어떤 생각? 나는 그것을 알아낼 수 없습니다. 또한, 왜 TWO 함수 정의가 < < (클래스 외부에 하나, 내부에 하나)에 필요합니까? 그것 없이는 작동하도록하는 어떤 방법이든? 마음에 들지 않으면 나는 그 일에 열심히 일해야한다.

+0

때문에. – juanchopanza

+0

두 번째 함수는 무한 재귀를 발생시킵니다. – Nawaz

+0

@Nawaz - 죄송합니다. 나는 수정했다. – Caife

답변

0

멤버 함수는 class_object << cout;이 작동합니다. 멤버 함수는 첫 번째 암시 적 매개 변수로 개체에 대한 포인터를 갖고 있기 때문입니다. 이것은 C++에서 반 직관적이기 때문에 잘못되었습니다.

다음 코드를

ostream& operator<<(ostream& os, X &class_object) 
{ 
    return class_object << os; 
} 

는 "거꾸로"멤버 연산자 오버로드를 사용하게하고 다시 반전, 이제 당신의 클래스에 대한 양방향 운영자 < < 작품.

유일한 적절한 코드 : 멤버 오퍼레이터가 LHS에`class_object` 소요

ostream& operator<<(ostream& os, X &class_object) 
{ 
    os << class_object.num; 
    return os; 
} 
+0

두 번째 기능에 실수가있었습니다. 지금 편집했습니다. – Caife

+0

내 결과에서 많이 바뀌지 않습니다. "멤버 연산자 오버로드를 사용하지 마십시오. 따라서 무료 연산자 오버로드에서 호출하지 마십시오." – stefaanv

관련 문제