cout << myclass를 어떻게 사용할 수 있습니까?


82

myclass 내가 작성한 C ++ 클래스입니다.

myclass x;
cout << x;

10또는 20.2, like an integer또는 float값을 어떻게 출력 합니까?

답변:


100

일반적으로 operator<<클래스에 대해 오버로딩 합니다.

struct myclass { 
    int i;
};

std::ostream &operator<<(std::ostream &os, myclass const &m) { 
    return os << m.i;
}

int main() { 
    myclass x(10);

    std::cout << x;
    return 0;
}

9
경우 있습니다 myclass어떤이 private필드를 원하는 operator<<()출력을로 myclass선언해야 std::ostream& operator<<(std::ostream&, myclass const&)친구로.
Justin Time-Monica 복원

3
const myclass &m대신 해야하지 myclass const &m않습니까?
Nubcake

3
@Nubcake : 아니요. 컴파일러가 신경 쓰는 한, 두 가지는 동일한 의미이지만, 여전히 접두사 형식이 잘못되었다고 생각합니다. C ++ 선언을 읽으려면 선언되는 것부터 시작 const하여 유형 뒤에 다음 과 같이 외향적으로 작업합니다 m is a reference to a const myclass.. 유형 앞에 "m은 myclass const`에 대한 참조이며 의미없는 것과 진정한 비문 법적 사이의 거친 가장자리에 있습니다.
Jerry Coffin

1
저처럼 혼란스러운 사람을 위해 연산자 오버로딩을 클래스 정의 외부 에 두십시오 (예제에서와 같이).
umnikos

1
@Lorenzo : 아니요, 멤버 함수가 될 수 없습니다. 자세한 내용은 stackoverflow.com/a/9814453/179910 을 참조하십시오.
Jerry Coffin

22

<<연산자 를 과부하시켜야합니다 .

std::ostream& operator<<(std::ostream& os, const myclass& obj)
{
      os << obj.somevalue;
      return os;
}

그런 다음 cout << x( 귀하의 경우 x유형이 어디에 있음 myclass) 그렇게하면 메서드에서 말한 모든 것을 출력합니다. 위 예의 경우 x.somevalue멤버가됩니다.

멤버 유형을에 직접 추가 할 수없는 경우 위와 동일한 방법을 사용하여 해당 유형에 ostream대한 <<연산자도 오버로드해야합니다 .


4
그것은 "스트림 연산자"가 아니라 왼쪽 시프트 연산자입니다. Iostreams의 맥락에서 이것은 삽입 또는 추출 연산자이지만 스트림 연산자는 아닙니다.
Billy ONeal 2010 년

1
죄송합니다, 네 말이 맞습니다. 나는 스트림을 다룰 때만 사용하는 경향이 있기 때문에 머리 속에 그것을 불렀습니다. 이 경우 단순히 스트림 연산자가 아닌 삽입 연산자입니다. 나는 그 비트를 제거하기 위해 내 대답을 업데이트했습니다.
Rich Adams

14

매우 쉽습니다. 구현하십시오.

std::ostream & operator<<(std::ostream & os, const myclass & foo)
{
   os << foo.var;
   return os;
}

outpout을 연결하려면 os에 대한 참조를 반환해야합니다 (cout << foo << 42 << endl)


-3

대안 :

struct myclass { 
    int i;
    inline operator int() const 
    {
        return i; 
    }
};
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.