Переопределить >> оператор как int - PullRequest
0 голосов
/ 25 марта 2012

это часть домашнего задания. Я не хочу, чтобы ответ просто помог. Я должен сделать класс с именем 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++;
}
}

Это почти работает! Теперь он захватывает правильное число, но он не заканчивается, когда я нажимаю Enter, мне нужно ввести букву, чтобы закончить.

1 Ответ

1 голос
/ 25 марта 2012

Вы можете создать перегрузку operator>> для своего класса следующим образом (как свободная функция, а не внутри класса):

std::istream& operator>>(std::istream& lhs, MyInt& rhs) {
    // read from lhs into rhs

    // then return lhs to allow chaining
    return lhs;
}

Вы можете использовать элементы peek и read из istream для чтения символов, isspace для проверки, является ли символ пробелом, и isdigit, чтобы проверить, является ли символ числом ( isspace и isdigit находятся в заголовке <cctype>).

...