C++ 我可以缩短这个istream函数吗?

C++ 我可以缩短这个istream函数吗?,c++,istream,C++,Istream,有没有什么办法我能做到这一点只有一两行?也许是 friend istream& operator>>(istream &is, Complex &c) { int re; int im; is >> re >> im; c.setReal(re); c.setImaginary(im); return is; } 但是这些函数需要一个int,我不知道该如何编码。如果您的函数是朋

有没有什么办法我能做到这一点只有一两行?也许是

friend istream& operator>>(istream &is, Complex &c) {
    int re;
    int im;

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

    return is;
}   

但是这些函数需要一个int,我不知道该如何编码。

如果您的函数是
朋友,它可以访问类的所有数据成员。我假设每个实部和虚部都有一个数据成员,因此可以更改代码以避免设置函数:

is >> setReal() >> setImaginary();
作为一般指导原则,最好通过公共接口,即使是冗长的,因为这意味着您不必仅仅因为更改了一些私有实现细节(例如,重命名那些成员变量,或者将类更改为库复杂类的包装器)而更新此函数的实现,但如果你更看重简洁,那就是你的选择


顺便说一句,Kerrek的评论是正确的:您的代码没有正确地失败。您可能需要考虑,如果真实或虚拟转换失败,您希望将复杂对象和流保留在什么状态……

您可以,但为什么?它是有效的,而且非常清晰。我认为较短的解决方案更难阅读。要使其更短,您需要返回对复杂类型字段的非常量引用,然后您可以执行
is>>c.real>>c.virtual
请检查生成的汇编语言,以查看是否有足够的理由将某些内容缩减为一行。就我个人而言,我喜欢你文章中代码的清晰性。你的代码没有正确地失败…>>那些函数取整数,而set函数的每个参数都取整数。不过,我想我会保持原样。我不担心速度,我只是不知道是否有更简单的方法。谢谢你的帮助。
friend istream& operator>>(istream &is, Complex &c)
{
    return is >> c.re_ >> c.im_;  // or whatever you've called the data members...
}