2013-02-19 184 views
0
friend istream& operator>>(istream &is, Complex &c) { 
    int re; 
    int im; 

    is >> re >> im; 
    c.setReal(re); 
    c.setImaginary(im); 

    return is; 
} 

有沒有什麼辦法可以做到這一行或兩行?也許類似的,我可以縮短這個istream函數嗎?

is >> setReal() >> setImaginary(); 

這些函數雖然需要一個int,但我不知道如何編碼。

+3

您可以但爲什麼?它的工作原理非常清晰。我會爭辯說一個更短的解決方案將更難以閱讀。爲了縮短它,你需要返回一個非const引用到Complex類型的字段,那麼你可以這樣做:is >> c.real >> c.imaginary' – 2013-02-19 01:37:13

+0

請檢查產生的彙編語言以查看是否存在是足夠好的原因,以減少某事的一線。就我個人而言,我喜歡你的文章中的代碼的清晰度。 – 2013-02-19 01:40:29

+1

你的代碼沒有正確地失敗... – 2013-02-19 01:41:32

回答

2

鑑於你的功能是friend,它可以訪問所有類的數據成員。我相信你會爲每個實部和虛部的數據成員,這樣你就可以改變你的代碼,以避免設定功能:

friend istream& operator>>(istream &is, Complex &c) 
{ 
    return is >> c.re_ >> c.im_; // or whatever you've called the data members... 
} 

作爲一般原則,最好是去通過公共接口即使因爲它意味着你不必僅僅因爲你改變了一些私有的實現細節(例如重命名這些成員變量,或者將你的類改變成一個圖書館複雜類的包裝)而更新這個函數的實現,但是如果你重視簡潔這裏更多的是你的選擇。

順便說一句/ - Kerrek的評論是正確的:你的代碼不會失敗。您可能想要考慮您想要將Complex對象和流都保留在什麼狀態,以避免實際或虛擬轉換失敗。......