覆盖>>运算符,如 int

Override >> operator like int

本文关键字:gt int 运算符 覆盖      更新时间:2023-10-16

这是家庭作业的一部分。我不想要一个答案,只是帮助。我必须创建一个名为MyInt的类,它可以存储任何大小的正整数。我只能使用cstring cctype iomanip和iostream库。我真的不知道从哪里开始。

6) 创建提取运算符>>的重载,用于从输入流中读取整数。此运算符应忽略数字前的任何前导空格,然后读取连续数字,直到遇到非数字为止(这与>>对普通int的工作方式相同,所以我们希望使我们的工作方式也相同)。此运算符应仅提取并存储对象中的数字。数字后遇到的"第一个非数字"可能是下一个输入的一部分,因此不应提取。您可以假设输入中的第一个非空白字符将是一个数字。也就是说,当你要求输入一个数字时,你不必错误地检查是否输入了不合适的类型(比如字母)。

示例:假设执行了以下代码,并且输入的是"123457894H"。

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++;
}
}

它几乎奏效了!现在它抓住了正确的数字,但当我点击回车键时它并没有结束,我必须输入一个字母才能结束。

您可以通过以下方式为类创建operator>>重载(作为一个免费函数,而不是在类内):

std::istream& operator>>(std::istream& lhs, MyInt& rhs) {
    // read from lhs into rhs
    // then return lhs to allow chaining
    return lhs;
}

您可以使用istream的成员peekread读取字符,使用isspace测试字符是否为空格,使用isdigit检查字符是否为数字(isspaceisdigit位于<cctype>标头中)。

首先,您的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也是。我会查看正则整数的提取运算符的源代码,看看的作用。