2010-02-28 4 views
5

C++에서 스트림 연산자를 오버로드하는 방법에 대해 약간 혼란 스럽습니다. 스트림 클래스의 함수이고 클래스는 아니기 때문입니다. 이것을하는 정상적인 방법은 무엇입니까? 현재 "get from"연산자의 경우 정의가 있습니다.내 클래스의 스트림 연산자 << >>을 오버로드하는 올바른 방법은 무엇입니까?

istream& operator>>(istream& is, Thing& thing) { // etc... 

작동합니다. Thing 클래스의 정의에는 언급되어 있지 않습니다. 구현에서 내 Thing 클래스의 멤버에 액세스 할 수 있기를 원합니다. 어떻게해야합니까?

답변

9

구현에 문제가 없습니다. 수행해야하는 유일한 추가 단계로 연산자를 선언하는 것입니다 friendThing의 : 다른 답변을 맞아

class Thing { 
public: 
    friend istream& operator>>(istream&, Thing&); 
    ... 
} 
+0

감사합니다. '공개 :'섹션에 없다는 것은 무엇을 의미합니까? – ghallio

6

당신은 operator>>을 Thing 클래스의 친구로 만듭니다.

8

.

class MyClass { 
    int x, y; 
public: 
    MyClass(int i, int j) { 
    x = i; 
    y = j; 
    } 
    friend ostream &operator<<(ostream &stream, MyClass ob); 
    friend istream &operator>>(istream &stream, MyClass &ob); 
}; 

ostream &operator<<(ostream &stream, MyClass ob) 
{ 
    stream << ob.x << ' ' << ob.y << '\n'; 

    return stream; 
} 

istream &operator>>(istream &stream, MyClass &ob) 
{ 
    stream >> ob.x >> ob.y; 

    return stream; 
} 
+2

연산자 <<를 다음과 같이 정의합니다. ostream & operator << (ostream & stream, const MyClass & ob); –

2

여러 가지 방법이 있고 오른쪽에 하나가 정말 클래스가 무엇을하는지에 따라 달라집니다 : 그것은 당신을 도와줍니다 경우, 여기에 코드 예제 (source)입니다.

정보를 읽을 수있는 공용 API가있는 경우가 종종 있습니다.이 경우 스트리밍 운영자는 개인 정보에 액세스 할 필요가 없습니다.

아마 가장 인기있는 방법은 클래스의 스트리밍 기능 친구를 선언하는 것입니다.

내가 가장 좋아하는 것은 Boost.Serialization 스타일 템플릿 기능을 제공하는 것입니다.이 템플릿 기능은 다른 방법과 함께 스트리밍하는 데 사용할 수 있습니다.

관련 문제