2013-02-19 9 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

Вы могли бы, но почему? Он работает и очень ясен. Я бы сказал, что более короткое решение будет труднее читать. Чтобы сделать его более коротким, вам нужно будет вернуть неконстантную ссылку на поля типа Complex, а затем вы можете сделать это >> is.c.real >> c.imaginary' –

+0

Пожалуйста, проверьте язык ассемблера, чтобы увидеть, достаточно хорош, чтобы свести что-то к одной линии. Лично мне нравится ясность кода в вашем посте. –

+1

Ваш код не срабатывает правильно ... –

ответ

2

Учитывая, что ваша функция - friend, она имеет доступ ко всем членам данных класса. Я предполагаю, что у вас есть элемент данных для каждого из действительных и мнимых компонентов, так что вы можете изменить свой код, чтобы избежать установленных функций:

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

В качестве общего принципа, что лучше пройти через открытый интерфейс, даже если verbose, так как это означает, что вам не нужно обновлять реализацию этой функции только потому, что вы изменяете некоторые частные детали реализации (например, переименование этих переменных-членов или изменение вашего класса как обертки вокруг сложного класса библиотеки), но если вы оцениваете сжатие здесь более того, это ваш выбор.

BTW/- Комментарий Керрека верен: ваш код не срабатывает неправильно. Возможно, вам захочется подумать о том, какое состояние вы хотите оставить как объект Complex, так и поток, должен либо сбой реального, либо мнимого преобразования ...

Смежные вопросы