2014-05-18 4 views
2

이진 파일의 일부를 다른 유형의 변수로 읽는 클래스가 있습니다.클래스에서 추출 연산자를 구현하는 방법은 무엇입니까?

class Foo { 
public: 
    size_t getSizeT(); 
    float getFloat(); 
    std::string getString(); 
private: 
    std::ifstream stream; 
}; 

이제 스트림 추출 연산자를 described in this answer으로 구현하고 싶습니다.

class Foo { 
public: 
    Foo &operator>>(Foo &foo, size_t &value); 
    Foo &operator>>(Foo &foo, float &value); 
    Foo &operator>>(Foo &foo, std::string &value); 
private: 
    std::ifstream stream; 
}; 

코드는 error C2804: binary 'operator >>' has too many parameters 오류 메시지와 함께 컴파일되지 않습니다. 스트림 추출 연산자를 올바르게 재정의하려면 어떻게해야합니까? 유형을 구분하고 연결 가능해야합니다. 무료 기능으로

답변

3

, 운영자의 서명이 있어야한다 : 멤버 함수 (귀하의 경우)으로

Foo& operator >>(Foo& foo, size_t& value); 

, 그것은해야한다 :

Foo& operator >>(size_t& value); 
2

클래스의 인스턴스가의 소스 인 경우 데이터를 사용하는 경우 입력 연산자 함수를 작성하는 두 가지 방법이 있습니다. 두 개의 인수를 취하는 독립형 전역 함수, 클래스의 인스턴스 및 대상 객체입니다. 또는 클래스의 멤버 함수로 작성한 다음 대상인 단일 인수 만 사용합니다.

글로벌 기능의 경우 예를 들어

class Foo { ... }; 

Foo& operator>>(Foo& foo, int& i) 
{ 
    // Get an integer and writes to `i` here 
    return foo; 
} 

예를 들면 다음과 같습니다. 당신은 클래스 내부 친구 함수를 인라인으로, 전역 함수를 사용하여 첫 번째 버전을 쓸 수 있기 때문에

class Foo 
{ 
public: 
    ... 

    Foo& operator>>(int& i) 
    { 
     // Get an integer and writes to `i` here 
     return *this; 
    } 
}; 

난 당신이 잘못된 연산자를 쓴 생각하는 이유는, 당신이 본 그 착각 전 친구 기능과 회원 기능 간의 차이.

당신은

class Foo 
{ 
public: 
    ... 

    // Notice the keyword `friend` 
    friend Foo& operator>>(Foo& foo, int& i) 
    { 
     // Get an integer and writes to `i` here 
     return foo; 
    } 
}; 

멤버 함수와 친구 기능은 미묘하지만 매우 중요 차이처럼 친구 기능을 사용합니다.