2015-05-27 2 views
3

Каков рекомендуемый подход для обновления объекта после создания потоком данных? Я хотел бы избежать использования нескольких методов SetXX.Оператор побитового сдвига влево

Скажем, у меня есть класс, который выглядит следующим образом:

class Model 
{ 
public: 
    Model(int, double, std::string); 
private: 
    int a; 
    double b; 
    std::string c; 
}; 

Один из подходов к решению этого вопроса заключается в добавлении оператора;

friend Model& operator<<(Model&, std::stringstream&) 

Использование вышеуказанного кода;

// create model 
Model model(...); 

// do stuff 

// update model later 
model << stream; 

Этот подход компилируется и запускается.

Просто интересно, если это хороший подход, и есть ли у него какие-то недостатки \ ограничения? Обратите внимание, что в большинстве случаев онлайн-оператор < < использует его иначе, чем то, что я делаю выше.

+4

Обычный способ получения информации из потока - это оператор ввода (или * right * shift) '>>', так что вы делаете, например. 'stream >> model', способ ввода данных из любого другого потока, например' std :: cin'. Ваш путь работает, но это необычно и не будет легко понять или понять другие, кроме вас самих (и, возможно, даже не через несколько месяцев). Не могли бы вы объяснить, почему вы хотите, чтобы это было наоборот? В чем смысл? –

+1

Если это рабочий код, то вопрос, вероятно, лучше подходит для http://codereview.stackexchange.com –

+2

Определенно хороший вопрос, однако он может быть более подходящим для [codereview] (http://codereview.stackexchange.com/), так как он касается рабочего кода, который не показывает ошибку. – Codor

ответ

2

Я предлагаю следовать тем же обозначениям, что и в стандартной библиотеке: используйте operator>> для ввода и возврата ссылки на поток, а не Model. Таким образом, это будет более читаемым для других (которые знакомы со стандартной библиотекой, но не вашей нотации), и это позволит прикованных входы:

friend std::istream & operator>>(std::istream & s, Model & m) 
{ 
    m.data = ... 
    return s; 
} 

Model m1, m2; 
std::cin >> m1 >> m2; 

Как std::istringstream происходит от std::istream, этот оператор будет работать для него, а также для всех других типов входных потоков.

0

Я хотел бы написать метод update, который берет поток вместо использования оператора. Недостатком с использованием оператора << является, как вы заявили, что он обычно не используется для этой цели, что, вероятно, будет раздражать всех, кто смотрит на ваш код, который не знает, как вы реализовали оператор. stream >> model чаще используется, как указано в комментариях.

+0

У меня нет проблем с методами setXX. В этом контексте мне нужен один метод, который сделал обновление, и мог определить, запускать ли сигнал, который другие подписываются. – Lars

+0

Если я перейду на использование оператора >>, вы бы предпочли использовать метод обновления? В чем причина этого? – Lars

+0

@Lars Я бы предпочел использовать метод обновления. По-моему, «обновление» более четко указывает, что делается, а не более общий «>>». Это может быть личное предпочтение (у меня есть фон Java, который не поддерживает перегрузку оператора). – Luke35

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