使istream运算符>>可以接受两个或三个值

时间:2019-03-16 07:20:41

标签: c++

因此,我正在尝试修改istream运算符>>以接受两个或三个值。 这是我到目前为止的内容:

在此示例中,Unit是要使用istream opeartor进行交互的类>>。

istream& operator>>(istream& istream, Unit& unit)
{
  string command;
  int val,val2;
  istream >> command >> val >> val2;
  if(command=="Damage")
  {
    unit.fCurrentHP-=val;
  }
  else if(command=="Heal")
  {
    unit.fCurrentHP+=val;
  }
  else if(command=="Move")
  {
    unit.pos[0]=val;
    unit.pos[1]=val2;
  }
  return istream
}

问题是,当我输入“伤害50”时,它仍然期望第二个值(val2),如何使输入具有选择性?还是能够保持活力,能够接受伤害50并更新,或者能够接受Move 5 -6并更新?

2 个答案:

答案 0 :(得分:2)

很简单,只有在确定需要时才读取第三个值

istream& operator>>(istream& istream, Unit& unit)
{
  string command;
  int val;
  istream >> command >> val;
  if(command=="Damage")
  {
    unit.fCurrentHP-=val;
  }
  else if(command=="Heal")
  {
    unit.fCurrentHP+=val;
  }
  else if(command=="Move")
  {
    int val2;
    istream >> val2; // third value needed
    unit.pos[0]=val;
    unit.pos[1]=val2;
  }
  return istream;
}

PS,这不是非法的,但是将变量istream命名为变量类型(也istream)是造成混乱的秘诀。

PPS也令人困惑,因为您调用了此功能operator>>>>通常用于读取整个对象的函数,但是您的版本不读取Unit对象。从代码中可以清楚地看到Unit对象已经存在,并且正在通过此函数进行更新。像

istream& update_unit(istream& istream, Unit& unit)

该函数将是一个更好的名字。

答案 1 :(得分:1)

什么时候做

  istream >> command >> val >> val2;

读取所有3个值(超出EOF),这不是您想要的,您需要单独读取

不要忘记测试错误情况

istream& operator>>(istream& in, Unit& unit)
{
  string command;
  int val, val2;

  if (! (in >> command))
    ...error
  else if(command=="Damage")
  {
    if (! (in >> val))
      ...error
    else
      unit.fCurrentHP -= val;
  }
  else if(command=="Heal")
  {
    if (! (in >> val))
      ...error
    else
      unit.fCurrentHP += val;
  }
  else if(command=="Move")
  {
    if (! (in >> val >> val2))
      ...error
    else {
      unit.pos[0]=val;
      unit.pos[1]=val2;
    }
  }
  else
    ...error

  return in;
}