2011-03-31 12 views
4

나는 Terminallog 클래스에 < < 연산자를 오버로드하고 있습니다. 내가 다음과 같이하면연산자 "<<"를 포인터에 사용

Terminallog clog(3); 
clog << "stackoverflow.com is cool" << endl; 

모두 정상적으로 작동합니다. "stackoverflow.com is cool"은 Terminallog가해야하는 것과 똑같은 색채로 화면에 인쇄됩니다.

error: invalid operands of types ‘Terminallog*’ and ‘const char [5]’ to binary ‘operator<<’ 

내가 그것을 포인터에 "< <"연산자를 통과 문제가 있음을 볼 수 있지만 내가 어떻게 할 수 있습니다

는 지금은 나에게 컴파일러 오류를 제공

Terminallog* clog = new Terminallog(3); 
clog << "stackoverflow.com is cool" << endl; 

시도 비 포인터 버전과 동일한 동작을 얻으시겠습니까? 간단히 포인터를 역 참조 할 수는 있지만 객체의 로컬 복사본이 생성됩니다 (성능에 좋지는 않습니다).

따라서 올바른 방법은 무엇일까요? 사전

ftiaronsem

+3

포인터를 역 참조하면 개체의 로컬 복사본이 만들어지지 않는다고 생각합니다. –

답변

8

하지가에서 지적되고있는 객체의 복사본을 생성한다. 일반적으로 포인터 역 참조는 복사본을 만들지 않으며 복사본을 만드는 유일한 방법은 명시 적으로 복사본을 만들거나 개체를 값으로 함수에 전달하거나 함수를 값으로 개체를 반환하는 것입니다. 역 참조를 가진 위의 코드는 아마 당신이 찾고있는 것이다.

+1

완전성을 위해 포인터를 역 참조하면 의미 적으로 참조가 만들어집니다. –

2

복사본을 생성하지 않는 포인터를 역 참조에

덕분에, 그것은 참조를 만듭니다. 당신은 단지 그것을 de-refle 수 있고 복사가없는 정확한 행동을 얻습니다.

1

간단한 :이 clog의 복사본을 생성하지 않습니다 (*clog) << "stackoverflow.com is cool" << endl;

.

+1

구문 오류가 있습니다. –

+0

아, 두 번을 복사했습니다. – MSalters

4

실제로 포인터의 역 참조는 사본이 아닌 참조를 제공하므로 괜찮습니다. (과해야 어쨌든, 실패 스트림을 복사하려고하면, 스트림 컨테이너하지만 데이터의 흐름이 아니다.) 당신은 포인터 타입을 복용 무료 ("글로벌") 함수 operator<<을 쓸 수 없습니다

*clog << "text" << std::endl; 

to-TerminalLog 왼쪽과 다른 것은 오른쪽에 있습니다. 왜냐하면 언어가 적어도 하나의 피연산자가 operator<< 인 클래스 또는 열거 형이어야하고 RHS 인수는 종종 하나가 아니기 때문입니다.

*clog << "My message" << endl; 

를 작성하는 포인터를 역 참조

+0

언어가 허용하지 않습니다. – Puppy

+0

@DeadMG : 물론 이죠. –

+0

추론이 잘못되었습니다. 피연산자의 측면에는 아무런 의미가 없습니다. 적어도 피연산자 중 하나는 클래스 또는 열거 형입니다. (http : // ideone.com/4zhQt) – visitor

1
Terminallog* clog = new Terminallog(3); 
Terminallog& clog_r = *clog; 
clog_r << "stackoverflow.com is cool" << endl; 
+0

당신은'Terminallog & clog_r = * clog;'를 의미합니다. – CharlesB