Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
#1

Перегрузка операторов ввода-вывода - C++

07.08.2013, 19:13. Просмотров 1249. Ответов 9
Метки нет (Все метки)

Доброго времени суток! Почему перестал работать >> оператор для стандартного типа char. Перегруженная операция cin>>one возвращает все тот же cin. Но при выводе cout<<oper; выводит в консоли символ 'М' все время. Помогите разобраться !
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
#include <fstream> // для потоковых файловых функций
#include <iostream>
#include <istream>
#include <ostream>
#include <string>
#include <typeinfo> // для typeid()
using namespace std;
#include <process.h> // для exit()
 
class frac
{
private:
    int numerator;   //DecimalFractions
    int denominator;
public:
    friend istream& operator>>(istream& is,frac& DF);
};
istream& operator>>(istream& is,frac& DF)
{
    char dumm;
    is>>DF.numerator>>dumm>>DF.denominator;
    return is;
}
 
void main()
{
   setlocale( LC_ALL,"Russian" );
   frac one;
   char oper;
   cin>>one>>oper;
   cout<<endl;
   cout<<oper;
 
   cout<<endl;
   system("pause");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.08.2013, 19:13     Перегрузка операторов ввода-вывода
Посмотрите здесь:

Перегрузка операторов ввода/вывода. - C++
Класс комплексных чисел. Нужно чтобы программа выводила и вводила в таком виде (функции in и out): #include &lt;iostream&gt; #include...

Перегрузка операторов ввода вывода - C++
ребята болит уже голова)) main.cpp #include &quot;myStr.h&quot; int main() { myStr myS(&quot;ok&quot;); cout&lt;&lt;myS&lt;&lt;endl;//надо чтоб...

Перегрузка операторов ввода/вывода - C++
Вроде сделал, но не работает перегрузка оператора ввода. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; ...

Перегрузка операторов ввода и вывода - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; class ComplexNumber { private: double a, b; ...

Перегрузка операторов ввода\вывода - C++
Вот такой простенький пример описан во многих постах, есть в некоторых видео но у меня в компиляторе mvs 2015, при компиляции выдает...

Перегрузка операторов ввода и вывода - C++
Добрый вечер! Помогите с задачкой.Я создал класс очередь и класс массив очередей.задача готова, но препод потребовал перегрузить оператор...

Перегрузка операторов ввода вывода - C++
в .h файле сделал объявление inline ostream&amp; operator &lt;&lt;(ostream&amp;, const Proc&amp;); inline istream&amp; operator &gt;&gt;(istream&amp;, Proc&amp;); в...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Valentina
68 / 68 / 3
Регистрация: 13.05.2012
Сообщений: 130
07.08.2013, 19:49     Перегрузка операторов ввода-вывода #2
Цитата Сообщение от ArkTaS Посмотреть сообщение
istream& operator>>(istream& is,frac& DF)
{
* * char dumm;
* * is>>DF.numerator>>dumm>>DF.denominator;
* * return is;
}
У Вас оператор вставки перегружен же на формат ввода 4/6, а не поотдельности. Вот так все работает
C++
1
2
3
frac one;
   cin>>one;
   cout<<one;
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
07.08.2013, 20:33  [ТС]     Перегрузка операторов ввода-вывода #3
Цитата Сообщение от Valentina Посмотреть сообщение
У Вас оператор вставки перегружен же на формат ввода 4/6, а не поотдельности. Вот так все работает
C++
1
2
3
frac one;
   cin>>one;
   cout<<one;
Это здесь совсем ни при чем и вопрос состоял в другом

Добавлено через 36 минут
В идеале должно работать одно выражение cin>>frac1>>operator>>frac2;
C++
1
2
3
   cin>>one>>oper;
   cout<<endl;
   cout<<oper;
cout<<oper; используется для проверки правильно ли извлечен символ. Это только начало программы которая представляет собой калькулятор
Valentina
68 / 68 / 3
Регистрация: 13.05.2012
Сообщений: 130
07.08.2013, 20:47     Перегрузка операторов ввода-вывода #4
Цитата Сообщение от ArkTaS Посмотреть сообщение
В идеале должно работать одно выражение cin>>frac1>>operator>>frac2;
Вы здесь абсолютно неправы.
Цитата Сообщение от ArkTaS Посмотреть сообщение
class frac
{
private:
* * int numerator; * //DecimalFractions
* * int denominator;
У Вас класс имеет переменные, Вы же пытаетесь
Цитата Сообщение от ArkTaS Посмотреть сообщение
cin>>frac1>>operator>>frac2;
вот этой строчкой сделать по сути вот это:
Цитата Сообщение от ArkTaS Посмотреть сообщение
frac one;
char oper;
C++
1
cin>>one.denominator>>one.dumm>>one.numerator;
только так Вы сделать не можете так как данные переменные приватные
может так понятней стало
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
07.08.2013, 21:47  [ТС]     Перегрузка операторов ввода-вывода #5
Цитата Сообщение от Valentina Посмотреть сообщение
Вы здесь абсолютно неправы.
Но невозможное возможно, знаю точно!
Уже сделал. Результат работы Перегрузка операторов ввода-вывода
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
#include <iostream>
#include <istream>
#include <ostream>
#include <string>
#include <typeinfo> // для typeid()
using namespace std;
#include <process.h> // для exit()
 
class frac
{
private:
    int numerator;   //DecimalFractions
    int denominator;
    static char op;
public:
    static char* oper() { return &op; }
    friend istream& operator>>(istream& ,frac& );
    friend istream& operator>>(istream& ,char*);
    friend ostream& operator<<(ostream& ,frac& );
    friend ostream& operator<<(ostream& ,char*);
};
char frac::op;
 
istream& operator>>(istream& is,frac& DF)
{
    char dumm;
    is>>DF.numerator>>dumm>>DF.denominator;
    return is;
}
ostream& operator<<(ostream& os,frac& FD)
{
    os<<FD.numerator<<'/'<<FD.denominator;
    return os;
}
istream& operator>>(istream& is,char* as)
{
    is>>*as;
    return is;
}
ostream& operator<<(ostream& os,char* sa)
{
    os<<*sa;
    return os;
}
 
void main()
{
   setlocale( LC_ALL,"Russian" );
   frac one, two;
 
   cout<<" Введите выражение ";
   cin>>one>>frac::oper()>>two;
   cout<<endl;
   cout<<" Ваше выражение ";
   cout<<one<<frac::oper()<<two;
 
   cout<<endl;
   system("pause");
}
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
07.08.2013, 22:07  [ТС]     Перегрузка операторов ввода-вывода #6
Можно еще больше упростить код. Не знаю как раньше не додумался. Думаю это все недосыпания. Результат тот же программа работает.
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
#include <fstream> // для потоковых файловых функций
#include <iostream>
#include <istream>
#include <ostream>
#include <string>
#include <typeinfo> // для typeid()
using namespace std;
#include <process.h> // для exit()
 
class frac
{
private:
    int numerator;   //DecimalFractions
    int denominator;
    static char op;
public:
    static char& oper(){return op;}
    friend istream& operator>>(istream& is,frac& DF);
    friend ostream& operator<<(ostream& is,frac& DF);
};
char frac::op;
istream& operator>>(istream& is,frac& DF)
{
    char dumm;
    is>>DF.numerator>>dumm>>DF.denominator;
    return is;
}
ostream& operator<<(ostream& is,frac& DF)
{
    char dumm;
    is<<DF.numerator<<'/'<<DF.denominator;
    return is;
}
 
void main()
{
   setlocale( LC_ALL,"Russian" );
   frac one,two;
 
   cin>>one>>frac::oper()>>two;
   cout<<endl;
   cout<<one<<frac::oper()<<two;
 
   cout<<endl;
   system("pause");
}
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.08.2013, 22:30     Перегрузка операторов ввода-вывода #7
Цитата Сообщение от ArkTaS Посмотреть сообщение
Помогите разобраться !
У меня работает (скрин). Не советую такие цепочки делать:
C++
1
cout<<one<<frac::oper()<<two;
http://alenacpp.blogspot.ru/2005/11/...ce-points.html
Миниатюры
Перегрузка операторов ввода-вывода  
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
07.08.2013, 23:04  [ТС]     Перегрузка операторов ввода-вывода #8
Цитата Сообщение от alsav22 Посмотреть сообщение
У меня работает (скрин). Не советую такие цепочки делать:
C++
1
cout<<one<<frac::oper()<<two;
http://alenacpp.blogspot.ru/2005/11/...ce-points.html
Проблему я свою уже давно решил и рабочий код выложил. Но за полезную ссылку спасибо.
Из той же оперы 150 < x >= 100 нельзя писать так как если восполниться 1-е условие 150 < x то дальше компилятор проверять не будет, то есть проверка x >= 100 не будет выполнена.
Поэтому нужно писать 150 < x && x >= 100.
Выражение cout<<one<<frac::oper() воспринимаю как функции.... Поскольку компилятор вычиляет слева на право то возвращаемое значение функции (cout<<one) будет 1-м аргументом для (cout<<one)<<frac::oper().
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.08.2013, 23:28     Перегрузка операторов ввода-вывода #9
Цитата Сообщение от ArkTaS Посмотреть сообщение
Проблему я свою уже давно решил и рабочий код выложил
Что поблему решили понятно... Почему код из первого поста у вас не работал?

Добавлено через 2 минуты
И насчёт инклудов:
C++
1
2
3
4
5
6
#include <fstream> // для потоковых файловых функций
#include <iostream>
#include <istream> // не нужен, достаточно iostream
#include <ostream> // не нужен, достаточно iostream
#include <string>
#include <typeinfo> // для typeid()
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2013, 23:35     Перегрузка операторов ввода-вывода
Еще ссылки по теме:

Перегрузка операторов присваивания, ввода, вывода - C++
Приветствую, помогите реализовать перегрузку операторов(в частности операторы присваивания, ввода, вывода) для данной программы. Я не могу...

Перегрузка операторов потокового ввода-вывода - C++
Пожалуйста, ответе на такой вопрос: почему при написании класса, при перегрузке операторов ввода-вывода, их обязательно нужно объявлять в...

Перегрузка операторов потокового ввода вывода - C++
Есть класс &quot;деканат&quot;, полем которого есть список студентов, объектов из класса &quot;Студент&quot;. Как переопределяя операторы &quot;&gt;&gt;&quot; &quot;&quot;&lt;&lt;&quot; вывести...

Перегрузка операторов ввода и вывода из потока в шаблонном классе - C++
Доброго времени суток. Пишу свой вектор. В нём надо перегрузить вышеназванные операторы. Vector.h class Vector { // ... ...

При раздельной компиляции не работает перегрузка операторов ввода-вывода - C++
разделил программу и при компиляции компилятор ругается на объявление перегрузки операторов ввода вывода(на скриншотах видно что он...


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

Или воспользуйтесь поиском по форуму:
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
07.08.2013, 23:35  [ТС]     Перегрузка операторов ввода-вывода #10
Цитата Сообщение от alsav22 Посмотреть сообщение
Почему код из первого поста у вас не работал?
Не знаю, могу предположить что с этим как то связано что в одном проекте лежит несколько исполнительных cpp файлов, хотя старые я всегда исключаю из проекта. Или сидел уставший и где то недоглядел. Но сейчас когда создал новый cpp то код из первого поста тоже заработал
Yandex
Объявления
07.08.2013, 23:35     Перегрузка операторов ввода-вывода
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru