2010-06-17 67 views
3

我怎樣才能過載「< <」運算符(COUT),所以我可以做「COUT」發送給類k的operator <<超負荷C++

+0

這「cout << k」(k是一個類) – aharon 2010-06-17 13:28:06

回答

17

的規範執行的任何類型的T輸出操作符是這樣的:

std::ostream& operator<<(std::ostream& os, const T& obj) 
{ 
    os << obj.get_data1() << get_data2(); 
    return os; 
} 

請注意,輸出流操作符通常不是成員函數。 (這是因爲二元運算符是成員函數,它們必須是它們左側參數類型的成員,但這是一個流,而不是你自己的類型。對於某些內置函數,有幾個重載爲operator<<()的例外,這是輸出流類的成員。)
爲此,如果不是T所有的數據都是公開訪問,此操作必須的T

class T { 
    friend std::ostream& operator<<(std::ostream&, const T&); 
    // ... 
}; 

朋友或操作者調用一個公共函數做流媒體:

class T { 
public: 
    void write_to_stream(std::ostream&); 
    // ... 
}; 

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

後者的優點是write_to_stream()成員函數可以是virtual(和純),允許多態類被流式傳輸。

如果你想成爲幻想和支持各類流,你必須模板化的是:

template< typename TCh, typename TTr > 
std::basic_ostream<TCh,TTr>& operator<<(std::basic_ostream<TCh,TTr>& os, const T& obj) 
{ 
    os << obj.get_data1() << get_data2(); 
    return os; 
} 

(模板,不過,不虛函數工作)

+0

OMG 3秒,你得到3票了嗎? – Arpegius 2010-06-17 13:30:12

+0

其中'T'是要打印的對象'k'的類型。 – MSalters 2010-06-17 13:30:53

+0

哇! waht是「T」(在「const T&obj」中)。以及如何將它添加到我的課程k? – aharon 2010-06-17 13:31:52