2012-12-13 5 views
3

운영자 :C++ "<<"나는이 수업이있어 과부하

// in Platform.h 
class Platform 
{ 
private: 
    float y; 
    float xi; 
    float xf; 
public: 
    Platform(float y, float xi, float xf); 
    virtual ~Platform(void); 
    float getxi(); 
    float getxf(); 
}; 

을 그리고 난이 할 수 있도록하려면 :

Platform* p = new Platform(1.0,2.0,3.0); 
cout << p; // should it be *p? 
나는 "< <"연산자를 오버로딩 시도

을 이 같은 :

// in Platform.cpp 
std::ostream& operator<<(std::ostream& out, Platform* p) 
{ 
    out << "Platform: xi=" << p->getxi() << ", xf=" << p->getxf() << std::endl; 
    return out; 
} 

그러나 p은을하기 때문에 이것은 단지, 물론 (메모리 주소를 출력 포인터 ...). 위의 함수가 전혀 호출되지 않았 음을 확신합니다. 이 밖에 볼 수 있도록

std::ostream& operator << (std::ostream& out, const Platform& p) { } 

는 또한 헤더 파일에이를 내 보내야합니다 ...

so cout << *p ; 

을 그리고 기존의 연산자는 다음과 같습니다

답변

2

예는 * P는 않습니다. 추가 :

friend std::ostream& operator<<(std::ostream& out, Platform* p) ; 

가 과부하 선언 당신이 그것을 사용하는 곳에서 볼 수 있어야

+3

* "에 대한 그렇지 않으면 템플릿 검색 및 포인터 인쇄 기능을 발견한다."* 아니, 자신의 과부하 대신 호출해야합니다 : 당신은 할 수 있습니다. Yakk이 말했듯이 그가 어디에서 전화를했는지는 알 수 없습니다. – Pubby

+0

예, 저의 실수입니다. 나는 * vs & 처음 읽은 것을 눈치 채지 못했습니다 ... –

+0

'cout << * p'를 호출하는 파일에'#include "Platform.cpp"를 추가해야합니까? –

2

Platform.h하십시오. 이 값을 Platform const&으로 변경하고 기존 방식이므로 *p을 사용하십시오.

0

실제로 이것은 g ++ 4.7.2에서 작동하지만 컴파일러에 따라 다를 수 있습니다.

// in Platform.cpp 
std::ostream& operator<<(std::ostream& out, Platform& p) 
{ 
    out << "Platform: xi=" << p.getxi() << ", xf=" << p.getxf() << std::endl; 
    return out; 
} 

및 인쇄 사용하여 간접 (*p)