运算符按位左移

时间:2015-05-27 07:34:33

标签: c++ c++11

使用数据流创建后更新对象的推荐方法是什么?我想避免使用多种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;

这种方法编译并运行。

只是想知道这是否是一个好方法,是否有任何缺陷\限制?请注意,大多数示例在线使用运算符&lt;&lt;使用它与我上面做的不同。

2 个答案:

答案 0 :(得分: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,此运算符将适用于它以及所有其他输入流类型。

答案 1 :(得分:0)

我考虑编写一个<<方法来获取流而不是使用运算符。正如您所说,使用操作员stream >> model的缺陷是,它通常不会用于此目的,这可能会激怒所有查看您的代码的人,而这些代码并不知道您是如何实现的运营商。如评论中所述,matches()更常用。