2012-12-13 129 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是指針......)。 我很確定上述函數根本沒有被調用。

回答

2

是做了* P:

so cout << *p ; 

和常規操作是......

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

您還需要在頭文件中導出此所以它是外部可見。地址:

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

要Platform.h

+3

*「否則,模板搜索並找到指針打印功能。」 *不,他的過載,應改爲調用。我猜,從Yakk說的那個地方他不知道從哪裏來。 – Pubby

+0

是的,我的錯誤。我沒有注意到*和第一次閱讀它... –

+0

我應該在調用'cout << * p'的文件中添加'#include「Platform.cpp」'嗎? –

2

超載聲明必須是從您使用它可見。將其更改爲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