这是家庭作业的一部分。我不希望答案只是帮助。我必须创建一个名为MyInt的类,它可以存储任何大小的正整数。我只能使用cstring cctype iomanip和iostream库。我真的不明白甚至从哪里开始。
6)创建提取运算符的重载>>用于从输入流中读取整数。此运算符应忽略数字前的任何前导空格,然后读取连续数字直到遇到非数字(这与>>正常int的工作方式相同,因此我们希望以相同的方式使我们的工作)。此运算符应仅提取并存储对象中的数字。在数字之后遇到的“第一个非数字”可能是下一个输入的一部分,因此不应该被提取。您可以假设输入中的第一个非空白字符将是一个数字。即,当您要求输入数字时,您不必错误地检查输入不合适的类型(如信件)。
示例:假设执行以下代码,输入的输入为“12345 7894H”。
MyInt x,y; char ch; cin>> x>> y>> CH; x的值现在应该是12345,y的值应该是7894,ch的值应该是'H'。
我的代码的最后一个状态如下:
istream& operator>>(istream& s, MyInt& N){
N.Resize(5);
N.currentSize=1;
char c;
int i = 0;
s >> c;
N.DigitArray[i++] = C2I(c);
N.currentSize++;
c = s.peek();
while(C2I(c) != -1){
s >> c;
if(N.currentSize >= N.maxSize)
N.Resize(N.maxSize + 5);
N.DigitArray[i] = C2I(c);
i++;
N.currentSize++;
}
}
它几乎可以工作!现在它抓住正确的数字,但是当我点击输入时它不会结束,我必须输入一封信才能结束。
答案 0 :(得分:1)
您可以通过这种方式为您的类创建operator>>
重载(作为自由函数,而不是在类中):
std::istream& operator>>(std::istream& lhs, MyInt& rhs) {
// read from lhs into rhs
// then return lhs to allow chaining
return lhs;
}
您可以使用peek
的{{1}}和read
成员读取字符,istream
来测试字符是否为空格,{{1}检查某个字符是否为数字isspace
和isdigit
位于isspace
标题中。
答案 1 :(得分:0)
首先,您的 operator>>
应该只关心从流中提取字符序列并根据您的规则知道何时停止。然后,它应该遵循 myInt
的构造函数来实际摄取该字符串。毕竟,该类可能希望公开如下构造函数:
myInt bigone ("123456123451234123121");
用于更通用的用途,对吗?而且,函数应该有一个单一的职责。
所以你的一般形式是:
istream& operator>> (istream& is, myInt x)
{
string s = extract_digits_from_stream(is);
x = myInt(s);
return is; // chaining
}
现在如何从流中仅提取数字并在非数字处停止?好吧,我想到了 peek
函数,unget
也是如此。我会查看常规整数的提取运算符的源代码,看看它做了什么。