2012-05-26 6 views
0

저는 C++을 배우기 위해 상태 머신을 사용하고 있으며, 오버로드 된 operator <<을 제공하여 int 대신 각각의 문자열을 반환하고자합니다. 길이에 대한 사과 ...<< 매핑 된 열거 형에서 <<을 올바르게 오버로드하는 방법?

#ifndef STATEMACHINE_H 
#define STATEMACHINE_H 

#include <map> 
#include <string> 

namespace statemachine{ 
    using namespace std; 

    enum State { ON, RESTING, SLEEPING, LOCKED, OFF }; 

    struct StateMap : map<unsigned int, string> 
    { 
     StateMap() 
     { 
      this->operator[](ON) = "ON"; 
      this->operator[](RESTING) = "RESTING"; 
      this->operator[](SLEEPING) = "SLEEPING"; 
      this->operator[](LOCKED) = "LOCKED"; 
      this->operator[](OFF) = "OFF"; 
     }; 

     ~StateMap(){}; 
    }; 

struct Machine { 

    Machine(State state) : statemap() { 
     m_currentstate = state; 
    } 

    // trying to overload the operator -- :(
    // Error 1 error C2676: binary '<<' : 'std::ostream' does not define this operator or a 
    // conversion to a type acceptable to the predefined operator **file** 38 1 statemachine_01 
    ostream& operator << (ostream& stream){ 
     stream << statemap[m_currentstate]; 
     return stream; 
    } 

    State state() const { 
     return m_currentstate; 
    } 

    void set_state(State state){ 
     m_currentstate = state; 
    } 

private: 
    State m_currentstate; 
    StateMap statemap; 
}; 

} 

#endif 

내가 뭘 잘못하고 있니?

+0

@OliCharlesworth : 저는 그 질문을 보았습니다. 정확히 같지 않습니다 - 우리는 두 가지 다른 컴파일 오류를 얻고있었습니다. – IAbstract

+0

하지만 그 질문에 답과 함께'operator <<'를 올바르게 오버로드하는 방법에 대한 코드 스 니펫이 나와 있습니다. –

+0

@OliCharlesworth : 나는 더 멀리 읽고 무엇이 작동하는지 알아 냈습니다. (http://stackoverflow.com/a/9230853/210709). – IAbstract

답변

0

Machine의 구성원으로 정의됩니다. 즉,이 같은 호출하는 것을 의미 :

machine << stream; 

대신 :

stream << machine; 

을 오른쪽에 인수를 할 수 있도록, 무료 함수로 operator을 정의해야합니다 주문. (다소 아마 잘)

friend ostream& operator << (ostream& stream, Machine const& m){ 
    stream << m.statemap[m.m_currentstate]; 
    return stream; 
} 
+0

By * 연산자를 자유 함수로 정의해야합니다. * ... 구조체가 아닌 내 헤더 파일을 의미합니까? 죄송합니다. C++을 처음 사용하고 어떻게 작동하는지 파악하려고합니다. 나는 C#에 익숙하다. – IAbstract

+0

@IAbstract : 자유 함수는 클래스의 멤버가 아닌 함수입니다. 만약 당신이'operator <<'정의를 나의 것으로 바꾸면, 그냥 작동해야합니다. 'inline' 함수를 선언하거나 (.cpp 파일로 그 정의를 옮기는 것), 헤더 파일에서 자유 함수를 정의하기 위해 중복 링커 에러가 발생하기 시작할 수 있습니다. –

+0

more detial을 설명하는 솔루션을 찾았습니다 : http://stackoverflow.com/a/9230853/210709 – IAbstract

0

그것은 과부하로 아무것도 할 필요가 없습니다 : 예를 들어, 당신은이 friend 함수가 될 만들 수 있습니다.

당신이 < <에 StateMap을 적용하는 방법을 정의하지 않은 것처럼

stream << statemap[m_currentstate]; 

이 실패하는이 문장.

[당신은 역시 statemap 클래스 < <에 과부하를해야합니다.]

죄송합니다, 독립형 기능이 아닌 방법을 필요로 다른 대답을 참조하십시오.

+0

'statemap [m_currentstate]'는 스트림 출력이 정의 된'std :: string'을 반환합니다. –

+0

네 말이 맞아. 내 대답은 말도 안돼. – JohnB

관련 문제