Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
 Аватар для Мимино
191 / 161 / 35
Регистрация: 22.05.2013
Сообщений: 455
Записей в блоге: 1

Перегрузка >>

25.06.2013, 01:26. Показов 1883. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Есть учебный пример перегрузки операций >> и <<.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include "stdafx.h"
#include <iostream>
using namespace std;
 
class PhoneNumber
{
public:
    friend ostream &operator << (ostream &, const PhoneNumber &);
    friend istream &operator >> (istream &, PhoneNumber &);
    void printPhone();
 
private:
    char areaCode[4];
    char exchange[4];
    char line[5];
};
 
void PhoneNumber::printPhone()
{
    cout << areaCode << endl;
    cout << exchange << endl;
    cout << line << endl;
}
 
ostream &operator << (ostream &output, const PhoneNumber &num)
{
    output << "(" << num.areaCode << ") "
           << num.exchange << "-" << num.line;
    return output;
}
 
istream &operator >> (istream &input, PhoneNumber &num)
{
    input.ignore();
    input.getline(num.areaCode, 4);
    input.ignore(2);
    input.getline(num.exchange, 4);
    input.ignore();
    input.getline(num.line, 5);
 
    return input;
 
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    PhoneNumber phone;
 
    cout << "Введите номер телефона в "
         << "виде (123) 456-7890: " << endl;
 
    cin >> phone;
    cout << "Был введен номер телефона: " << endl
         << phone << endl;
 
    phone.printPhone();
    system("pause");
    return 0;
}
Проблема в следующем. Если я ввожу номер телефона одной строкой, то срабатывает только
C++
1
2
input.ignore();
    input.getline(num.areaCode, 4);
, а
C++
1
2
3
4
input.ignore(2);
    input.getline(num.exchange, 4);
    input.ignore();
    input.getline(num.line, 5);
просто пропускает.
Нормально работает, если я ввожу так:
(123
) 456
-7890

Объясните плз, в чем загвоздка?

Добавлено через 17 минут
Получилось исправить вот таким вот образом
C++
1
2
3
4
5
6
7
8
9
10
11
12
istream &operator >> (istream &input, PhoneNumber &num)
{
    input.ignore();
    input.getline(num.areaCode, 4, ')');
    input.ignore();
    input.getline(num.exchange, 4, '-');
    //input.ignore();
    input.getline(num.line, 5);
 
    return input;
 
}
Но все же мне не понятно, почему не сработал 1-й вариант. Может кто объяснить пошагово, что там происходило при вводе одной строкой:
(123) 456-7890
?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.06.2013, 01:26
Ответы с готовыми решениями:

Перегрузка в виде метода VS Перегрузка в виде функции друг
Привет! Собственно сабж: В каких случаях используется перегрузка в виде метода, а когда в виде функции друг? Добавлено через 4...

Множественное наследование, Перегрузка функций, Перегрузка операторов, Использование дружественных функций и классов, Использование шаблонов классов
Здравствуйте!!! Я бы хотел попросить помоч решить...ну или скинуть примеры таких задач, если вдруг у вас они завалялись на компе или...

перегрузка >> и <<
Решил попробовать перегрузить операции ввода и вывода,почему то выводятся 0, вместо нужных значений,подскажите в чем косяк #include...

16
31 / 31 / 4
Регистрация: 15.04.2011
Сообщений: 81
25.06.2013, 01:35
потому что метод istream::getline() выставляет failbit если не нашел перехода не новую строку через 4 символа. Дальше соответственно ничего не читается
http://www.cplusplus.com/refer... m/getline/
2
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
25.06.2013, 01:36
@Мимино, Вдумайтесь, пожалуйста, в название метода getline: "получить строку". У вас в операторе >> getline вызывается 3 раза соответственно должно быть 3 строки. Так как getline по умолчанию ищет символ '\n' для завершения и вашем случаи он находит его только один раз, так как вводиться всего лишь одна строка.
1
31 / 31 / 4
Регистрация: 15.04.2011
Сообщений: 81
25.06.2013, 01:37
The failbit flag is set if the function extracts no characters, or if the delimiting character is not found once (n-1) characters have already been written to s. Note that if the character that follows those (n-1) characters in the input sequence is precisely the delimiting character, it is also extracted and the failbit flag is not set (the extracted sequence was exactly n characters long).

http://www.cplusplus.com/refer... m/getline/
1
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
25.06.2013, 01:40
Более по научному выразился выше ksandro
1
 Аватар для Мимино
191 / 161 / 35
Регистрация: 22.05.2013
Сообщений: 455
Записей в блоге: 1
25.06.2013, 01:43  [ТС]
Цитата Сообщение от ksandro Посмотреть сообщение
потому что метод istream::getline() выставляет failbit если не нашел перехода не новую строку через 4 символа. Дальше соответственно ничего не читается
http://www.cplusplus.com/refer... m/getline/
Да, но разве failbit распространяется на последующие вызовы istream::getline()?
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
25.06.2013, 01:46
Можно, конечно, каждый раз восстанавливать поток в рабочее состояние:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
istream &operator >> (istream &input, PhoneNumber &num)
{
    input.ignore();
    input.getline(num.areaCode, 4);
    std::cout << num.areaCode << std::endl;
    input.clear();
    input.ignore();
    input.ignore();
    input.getline(num.exchange, 4);
    std::cout << num.exchange << std::endl;
    input.clear();
    input.ignore();
    input.getline(num.line, 5);
    std::cout << num.line << std::endl;
 
    return input;
}
Но правильней, наверное, просто парсировать строку.

Добавлено через 1 минуту
@Мимино, конечно, поток находиться в ошибочном состоянии и чтоб его вернуть нужно вручную менять флаг либо вызвать метод clear()
1
31 / 31 / 4
Регистрация: 15.04.2011
Сообщений: 81
25.06.2013, 01:49
Цитата Сообщение от Мимино Посмотреть сообщение
Да, но разве failbit распространяется на последующие вызовы istream::getline()?
да, failbit распространяется объект istream, и он будет выставлен пока объект живой, или пока его вручную не поменяют.

тут можно почитать: http://www.cplusplus.com/refer... e/iostate/
1
 Аватар для Мимино
191 / 161 / 35
Регистрация: 22.05.2013
Сообщений: 455
Записей в блоге: 1
25.06.2013, 01:56  [ТС]
Цитата Сообщение от xtorne21st Посмотреть сообщение
@Мимино, конечно, поток находиться в ошибочном состоянии и чтоб его вернуть нужно вручную менять флаг либо вызвать метод clear()
Не понятно только одно :
failbit The last input operation failed because of an error related to the internal logic of the operation itself.
Цитата Сообщение от xtorne21st Посмотреть сообщение
Но правильней, наверное, просто парсировать строку.
Да, до этого я вроде как додумался.

_________
Все, увидел. Дошло, разобрался Спасибо всем.
0
31 / 31 / 4
Регистрация: 15.04.2011
Сообщений: 81
25.06.2013, 02:04
ну, вообщем-то там написано, что последняя операция ввода вызвала ошибку. После этой ошибки, больше операций ввода не будет, несмотря на то что getline ты вызываешь. То есть это имеется ввиду не последний вызов функции а последнее реальное чтение из потока.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
25.06.2013, 02:09
Цитата Сообщение от Мимино Посмотреть сообщение
Нормально работает, если я ввожу так:
(123
) 456
-7890
Непонятно только, как это у вас нормально работало, если первая getline() позволяет ввести не более 3-х символов, а вы вводили 4.
0
31 / 31 / 4
Регистрация: 15.04.2011
Сообщений: 81
25.06.2013, 02:23
Цитата Сообщение от alsav22 Посмотреть сообщение
Непонятно только, как это у вас нормально работало, если первая getline() позволяет ввести не более 3-х символов, а вы вводили 4.
он сначала вызывал ignore которая читала и отбрасывала первый символ "("
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
25.06.2013, 02:29
Понял.
0
 Аватар для Olivеr
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
25.06.2013, 10:28
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
istream &operator >> (istream &input, PhoneNumber &num)
{
    input.ignore( numeric_limits<streamsize>::max(), '(' );
    input.get(num.areaCode, 4, ')');
 
    input.ignore( numeric_limits<streamsize>::max(), ' ' );
    input.get(num.exchange, 4, '-');
 
    input.ignore( numeric_limits<streamsize>::max(), '-' );
    input.get(num.line, 5);
 
    return input;
}
Миниатюры
Перегрузка >>   Перегрузка >>  
1
 Аватар для Мимино
191 / 161 / 35
Регистрация: 22.05.2013
Сообщений: 455
Записей в блоге: 1
25.06.2013, 10:49  [ТС]
@Olivеr,
спасибо конечно, но это к чему?
0
 Аватар для Olivеr
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
25.06.2013, 11:00
@Мимино, так у вас проблемы с вводом были.

Добавлено через 46 секунд
UPD: не заметил в первом посте решение
0
 Аватар для Мимино
191 / 161 / 35
Регистрация: 22.05.2013
Сообщений: 455
Записей в блоге: 1
25.06.2013, 11:08  [ТС]
Цитата Сообщение от Olivеr Посмотреть сообщение
@Мимино, так у вас проблемы с вводом были.
Не с вводом, а с пониманием Но все-равно спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.06.2013, 11:08
Помогаю со студенческими работами здесь

перегрузка
помогите сделать перегрузку пожалуйста... static public void Method2() { const byte m = 5, n = 7; ...

перегрузка []
Здарова никак не могу перегрузить имеется класс Int2 моделирующий int я перегрузил rvalue тоесть при вызове int a; Int2...

Перегрузка +
код: #include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; template &lt;class T &gt; class theMatrix { ...

Перегрузка +
#include &lt;iostream&gt; using namespace std; class loc { int n , m; public: loc() {} loc( int lg , lt) { n = lg; m =...

Перегрузка
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication17 { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru