2009-02-02 9 views
2

문제는 주관적, 그래서 당신은 당신의 클래스에 대한이 친구 함수를 작성 피할 할 때 일반적으로, 당신이 쓰는 수업이를 정의 할클래스에 대해 ostream 연산자 <<를 언제 정의합니까?

std::ostream& operator << (std::ostream & o, const SomeClass &a) { 
    return o << a.accessor().. ; 
} 

의 구문 수 있습니다.

답변

1

프로덕션 코드에서이 코드를 오버로드하지 않았습니다. 많은 정보를 기록 할 경우이 작업을 원할 수도 있지만 유용 할 것입니다.

4

스트리밍과 관련이 있거나 이동 및 클래스가 순전히 숫자 인 경우에만 연산자 < < 만 오버로드됩니다. 코드 에서처럼 ostream에 무언가를 쓰려면 괜찮다고 생각합니다. 다른 것은, 내가 생각하기에, 혼란을 일으킬 것이고 나는 다른 목적을 위해 멤버 함수를 더 잘 사용할 것이다. Qt는이 문자열 목록으로 어떻게하는지

StringList list; 
list << "foo" << "bar" << "baz"; 

그것은, 그리고 내가 아주 좋은 찾을 수있는 : 나는 여전히 규칙에 예외로 할 것이라고 생각하는 또 다른 응용 프로그램은이 같은 일을하고있다. 내가 클래스를 스트리밍 할 경우

+0

와우, 아주 좋습니다. –

8

나는 보통이 쓰기 :

std::ostream& operator << (std::ostream& o, const SomeClass& a) 
{ 
    a.print(o); 
    return o; 
} 

다음 인쇄 스트림에 클래스를 직렬화하는 방법을 알고 SomeClass에 CONST 방법합니다.

+1

operator << 함수 템플릿을 만든 경우, 한 번만 쓰면됩니다. 그러면 print (ostream &) 멤버 함수가있는 클래스에서 작동 할 것입니다. – Ferruccio

+0

겸손 추가 : print (ostream &)의 매개 변수는 참조 유형이어야합니다. 그렇지 않으면 연속 출력을 추가하지 않습니다. 예 : cout << foo1 << foo2; –

+0

@Comptrol : 사실이 아닙니다. 1 : 스트림은 참조로만 전달 될 수 있으므로 print()는 print (std :: ostream &)로만 수행 할 수 있습니다. 2 : 이것은 chaning과 아무 관련이 없습니다. 연산자 <<는 체인 연결을 허용하기 위해 스트림 참조를 반환해야하며 그렇지 않습니다. –

3

위의 마틴의 대답의 이점은 무료 다형성을 얻을 수 있다는 것입니다. print(ostream&)가상으로 설정하면 < < 연산자가 가상 ​​함수처럼 작동합니다!

연산자에 과부하가 걸리면 클래스가 스트림 (파일, 소켓 등 ...)에 기록 될 수 있어야한다고 생각할 때 언제든지 그렇게하십시오. 이것은 심지어 디버그 목적을 위해서만있을 수 있습니다. 클래스의 내부를 출력 할 수 있으면 유용하기 때문에이 연산자에 과부하가 걸릴 수 있습니다.

0

해당 연산자를 사용하려는 경우에만이를 구현합니다. 이것은 거의 결코 아닙니다 ... 그것을 구현하지 않은 것에 대한 나의 이유는 그러므로 그것을 사용하지 않습니다. 공개 용으로 사용한다면 완벽을 기하기 위해 포함 시키되, 대부분 자신의 프로젝트에있는 모든 클래스에이 클래스를 포함시키지 않을 것입니다. 왜냐하면 대부분 클래스를 스트림에 출력 할 필요가 없기 때문입니다. 예 : 클래스에 엔트리 포인트를 래핑하면이 연산자를 제공하는 것이 무의미합니다.

2

로깅과 같은 용도로 사용하는 것이 좋습니다. 그래서 당신은 할 수 있습니다 : 어쩌면

SystemLog systemLog; 
systemLog << "Processing Item #15"; 
systemLog << "Error 0014: Bad things happened."; 
systemLog << system.executeCommand(cmd); // returns a result string 

또는를 같이 네트워킹 :이 일을 구현 물론

NetworkInterface networkInterface; 
string message("Hello World! I'm a server."); 
networkInterface << message; 

일반 기능도 가능하며 단지 것이 바람직 할 수도있다. 일반적으로 연산자 오버로딩에주의해야합니다. 실제로 사용할 때만 사용하십시오.

0

디버깅을 위해 로그에 객체를 덤핑하는 것이 매우 편리하기 때문에 매우 자주 수행합니다.

관련 문제