2013-11-24 74 views
0

我試圖添加這些功能很好地工作是這樣的:超載<< and >>與指針C++

TrashCan(int size, int contents); 

我很熟悉重載簡單的操作,如+ - 和≤但是當涉及到重載iostream函數以便它們使用指針時,我感到非常困惑。有任何想法嗎?

+0

最終目的是提供一種將這些對象序列化到磁盤或從磁盤序列化的方法? – enhzflep

+0

我對你的實際問題有些困惑。這個程序是否編譯?如果不是,那麼錯誤信息是什麼?或者你在問最佳實踐? – dyp

回答

0

您不應該重載運算符指針。您應該傳遞一個對象或對該對象的引用。

他們應該聲明是這樣的:

std::ostream& operator <<(std::ostream& out, const TrashCan & drive); 
std::istream& operator >>(std::istream& in, TrashCan & drive); 
1

雖然可能只是超載輸入和輸出操作符的指針,我不認爲這是擺在首位的好主意:在C++很少需要使用指針,鼓勵用戶使用操作符沒有意義。也就是說,簡單的解決方案是:不要使用指針

從概念上講,重載指針的輸入或輸出操作符與其他類型相比,沒有什麼不同。也就是說,你只是超載

std::ostream& operator<< (std::ostream& out, TrashCan const* drive) { 
    return *drive; 
} 
std::istream& operator>> (std::istream& in, TrashCan* drive) { 
    return *drive; 
} 

兩者的實現只是委託給相應的參考版本減少了問題的一個問題與已知的解決方案(I/O與對象的引用)。

+0

@DyP:對於內置類型(包括指針),ADL不會在有趣的地方查找。在partiuclar中,它不會查找指向類的類型定義的名稱空間(如果我記得正確)。至於沒有真正被允許:在第17章中有關於什麼可以被重載而不涉及用戶定義的類型的限制,並且因爲指針被視爲內置類型,這些重載不涉及任何用戶定義的類型。 –

+0

@DyP:有趣。根據這個條款,指針應該對搜索的命名空間集起作用。我不知道我爲什麼得出結論,他們不會。我也找不到對超載的限制。似乎,我需要修改我的答案(儘管我會堅持使用指針不是一個好主意anwyay)。 –

1

我個人認爲重載TrashCan對象更有意義,然後在需要打印對象的位置取消引用指針。

不知道你的問題,我會建議你只需要一個簽名。

// Take const reference, not pointer 
friend std::ostream& operator <<(std::ostream& outs, const TrashCan& drive); 


TrashCan * ptrCan = new TrashCan(0, 0); 
// [...] 
std::cout << *ptrCan << endl; // dereference. no copies made. 

具有一個函數定義的另一個好處是,代碼會更易於維護,即你不會有需要在平行於被保持,或重構爲使用相同的代碼的函數的兩個重載。