2013-02-19 63 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对象和流都保留在什么状态,以避免实际或虚拟转换失败。......