C++ 重载输入运算符未能通过自动简单输入测试
所以我的一个作业问题的简单输入测试失败了。我要分析两个被空格分隔的整数。这两个整数用于我定义为类的Rationalnumber类型的私有成员num和denom。这段代码中是否有明显的非常规内容?这段代码适用于我的所有测试C++ 重载输入运算符未能通过自动简单输入测试,c++,operator-overloading,C++,Operator Overloading,所以我的一个作业问题的简单输入测试失败了。我要分析两个被空格分隔的整数。这两个整数用于我定义为类的Rationalnumber类型的私有成员num和denom。这段代码中是否有明显的非常规内容?这段代码适用于我的所有测试 std::istream &operator>>( std::istream &is, Rationalnumber &r ) { Rationalnumber::in++; // increment counter
std::istream &operator>>( std::istream &is, Rationalnumber &r ) {
Rationalnumber::in++; // increment counter
// get the num
string n;
getline(cin,n,' ');
stringstream ssnum(n);
ssnum >> r.num;
// get the denom
string d;
getline(cin,d,'\n');
stringstream ssdenom(d);
ssdenom >> r.denom;
return is;
}
您的代码至少有两种明显的失败方式:
'\t'
,则代码无法识别该空格按照惯例,当输入失败时,valuevread保持不变。对于您的实现来说,这也是不正确的。为了解决问题,代码实际上可以简化,并在这个过程中变得更加缓慢。由于这显然是一项家庭作业,我认为提供代码并不合适。此代码通过了测试!:
std::istream &operator>>( std::istream &is, Rationalnumber &r ) {
Rationalnumber::in++; // increment counter
int in;
is >> in;
r.numerator(in);
is >> in;
r.denominator(in);
return is;
}
代码可以缩短很多,并且没有错误检查。除此之外,它失败的输入是什么?其他人似乎都没有通过测试的问题,因此没有太多关于测试测试内容的讨论。我会自己试试别的,看看是否通过。看来你是在假设第二个数字在这行的末尾。这是一个有效的假设吗?是的,我很确定…我还能做什么?也许我会让它包含一个动态向量。为什么要把它作为字符串读入并转换成一个数字(我想),而不是直接读入数字?只需一条语句即可完成:
is>>r.num>>r.denum代码>。