因此,我正在尝试修改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并更新?
答案 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;
}