覆盖>>像int这样的运算符

时间:2012-03-25 01:58:22

标签: c++ operator-keyword

这是家庭作业的一部分。我不希望答案只是帮助。我必须创建一个名为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++;
}
}

它几乎可以工作!现在它抓住正确的数字,但是当我点击输入时它不会结束,我必须输入一封信才能结束。

2 个答案:

答案 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}检查某个字符是否为数字isspaceisdigit位于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 也是如此。我会查看常规整数的提取运算符的源代码,看看做了什么。