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

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

Восстановить пароль Регистрация
 
Starfalll
0 / 0 / 0
Регистрация: 09.03.2013
Сообщений: 32
10.03.2013, 15:21     Перегрузка оператора ввода #1
Данные вводятся в виде [a,b]
C++
1
2
3
4
5
6
7
8
9
std::istream& operator >> (std:: istream& in,const Przedzial& pol)
{
    in >> "[";
    in >> pol.low;
    in >> ",";
    in >> pol.up;
    in >> "]";
    return in;
}
Но что-то эта перегрузка не работает. Компилируется и зависает.Хотя подобная перегрузка для оператора вывода работает.В чем ошибка?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2013, 15:25     Перегрузка оператора ввода #2
const уберите.
Starfalll
0 / 0 / 0
Регистрация: 09.03.2013
Сообщений: 32
10.03.2013, 15:33  [ТС]     Перегрузка оператора ввода #3
Ничего не изменило, теперь еще и ошибку выдает(
error C2678: binary '>>' : no operator found which takes a left-hand operand of type 'std::istream' (or there is no acceptable conversion)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2013, 16:07     Перегрузка оператора ввода #4
Увидел... Это что?
C++
1
in >> "[";
Чтение в строковый литерал?

Добавлено через 2 минуты
Читать нужно в переменную.
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
10.03.2013, 16:41     Перегрузка оператора ввода #5
Starfalll, у тебя 2 вхождения такой строки:
C++
1
std::istream& operator >> (std:: istream& in,const Przedzial& pol)
const нужно убрать в обоих.

Не, я гоню, одно вхождение. Сори.
Starfalll
0 / 0 / 0
Регистрация: 09.03.2013
Сообщений: 32
10.03.2013, 18:59  [ТС]     Перегрузка оператора ввода #6
Появился еще один вопрос.
У меня есть перегрузка суммирования такого вида : (обьект класса) + число
C++
1
2
3
4
5
Przedzial& Przedzial::operator+(const Przedzial& lol)
{
low=lol.low+low; up=lol.up + up;
return *this;
}
Но оно не работает для суммирования вида : число + (обьект класса)

Пусть z1- обьект класса.
Для z1+ 1 все работает нормально.
А для 1+z1 вылетает ошибка.Для такого варианта нужно специально перегружать "+"?
mazukta26
1 / 1 / 0
Регистрация: 25.02.2013
Сообщений: 36
10.03.2013, 19:06     Перегрузка оператора ввода #7
потому что ты суммируешь в объект класса, т.е. вместо "+" на самом деле у тебя реализовано "+="
вообще говоря, должно работать так:
C++
1
2
3
4
5
6
Przedzial Przedzial::operator+(const Przedzial& lol)
{
Przedzial n;
n.low=low+lol.low;
n.up=up+lol.up;
return n;
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2013, 19:13     Перегрузка оператора ввода #8
Цитата Сообщение от Starfalll Посмотреть сообщение
У меня есть перегрузка суммирования такого вида : (обьект класса) + число
C++
1
2
3
4
5
6
Przedzial Przedzial::operator+(const Przedzial& lol)
{
Przedzial n;
n.low=low+lol.low;
n.up=up+lol.up;
return n;
И где здесь число? Вижу перегрузку для двух объектов.

Добавлено через 2 минуты
Цитата Сообщение от Starfalll Посмотреть сообщение
А для 1+z1 вылетает ошибка.Для такого варианта нужно специально перегружать "+"?
Специально. И для первого варианта (z1 + 1), тоже специально.
Starfalll
0 / 0 / 0
Регистрация: 09.03.2013
Сообщений: 32
10.03.2013, 19:18  [ТС]     Перегрузка оператора ввода #9
Цитата Сообщение от alsav22 Посмотреть сообщение
C++
1
2
3
4
5
6
Przedzial Przedzial::operator+(const Przedzial& lol)
{
Przedzial n;
n.low=low+lol.low;
n.up=up+lol.up;
return n;
И где здесь число? Вижу перегрузку для двух объектов.

Добавлено через 2 минуты

Специально. И для первого варианта, тоже специально.
А разве тут
C++
1
2
3
4
5
Przedzial& Przedzial::operator+(const Przedzial& lol)
{
low=lol.low+low; up=lol.up + up;
return *this;
}
нету числа и обьекта?

И как же мне сначала принимать число , а потом объект? То есть для варианта 1 + z1
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2013, 19:29     Перегрузка оператора ввода #10
Цитата Сообщение от Starfalll Посмотреть сообщение
А разве тут
Przedzial& Przedzial::operator+(const Przedzial& lol)
{
low=lol.low+low; up=lol.up + up;
return *this;
}
нету числа и обьекта?
И где число тут? Объект слева вызывает оператор +, справа объект-параметр.

Добавлено через 1 минуту
А то что он у вас работает для вида z + 1, так есть ещё и неявное приведение типов. Конструктор с одним параметром есть?
Starfalll
0 / 0 / 0
Регистрация: 09.03.2013
Сообщений: 32
10.03.2013, 19:30  [ТС]     Перегрузка оператора ввода #11
C++
1
2
3
4
5
6
Przedzial& Przedzial::operator + (double& goh)
{   
    low= goh+this->low;
    up= goh+this->up ;
    return *this;
}
еще был такой вариант, число ,оператор + . Но он не исправил ошибку.
p.s. извините если задаю похожие вопросы , просто совсем недавно взялся за классы и еще не все сразу понимаю
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2013, 19:46     Перегрузка оператора ввода #12
Цитата Сообщение от Starfalll Посмотреть сообщение
И как же мне сначала принимать число , а потом объект? То есть для варианта 1 + z1
Перегрузите как дружественную функцию.
C++
1
2
3
4
Przedzial operator+(double n, const Przedzial& lol)
{
 
}
Starfalll
0 / 0 / 0
Регистрация: 09.03.2013
Сообщений: 32
10.03.2013, 19:48  [ТС]     Перегрузка оператора ввода #13
Но ведь если я перегружу как дружественную функцию то я не смогу изменять значение полей low и up?
Точнее именно на это ругается VS
'Przedzial::low' : cannot access private member declared in class 'Przedzial'
1> f:\pulpit\przedzial.h(33) : see declaration of 'Przedzial::low'
1> f:\pulpit\przedzial.h(10) : see declaration of 'Przedzial'
C++
1
2
3
4
5
6
7
Przedzial& operator + (double& goh, Przedzial& lol)
{   
    lol.low= goh+lol.low;
    lol.up= goh+lol.up ;
    return lol;
 
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2013, 19:54     Перегрузка оператора ввода #14
Цитата Сообщение от Starfalll Посмотреть сообщение
Но ведь если я перегружу как дружественную функцию то я не смогу изменять значение полей low и up?
Как раз наоборот. Для этого и объявляют как дружественную, чтобы она имела доступ к приватным полям класса. А что компилятор ругается, то я не вижу объяления, вижу реализацию.

Добавлено через 1 минуту
В теле класса прописать:
C++
1
friend Przedzial& operator+(double n, Przedzial& obj);
Starfalll
0 / 0 / 0
Регистрация: 09.03.2013
Сообщений: 32
10.03.2013, 20:37  [ТС]     Перегрузка оператора ввода #15
такое в теле класса
C++
1
friend Przedzial& operator+(double &, const Przedzial& lol);
такое в объявлении
C++
1
2
3
4
5
6
7
Przedzial& operator + (double& goh, Przedzial& lol)
{   Przedzial n;
n.low= goh+lol.low;
    n.up= goh+lol.up ;
    return n;
 
}
это дружественная функция , но доступа до приватных low i up нету
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2013, 20:44     Перегрузка оператора ввода #16
Цитата Сообщение от Starfalll Посмотреть сообщение
это дружественная функция , но доступа до приватных low i up нету
Должен быть.
Цитата Сообщение от Starfalll Посмотреть сообщение
такое в объявлении
Это определение (реализация). Оъявление это прототип.

Добавлено через 32 секунды
Класс покажите.

Добавлено через 2 минуты
Увидел... В объявлении const в параметрах, а в реализации без. Нужно одинаково.
Starfalll
0 / 0 / 0
Регистрация: 09.03.2013
Сообщений: 32
11.03.2013, 00:33  [ТС]     Перегрузка оператора ввода #17
Огромное спасибо alsav22. Теперь я уже лучше все понимаю. Но остались маленькие вопросы.
Например: плюс для двух обьектов класса. Если вывожу в функции n, то получаю нормальные значения.
а с return возвращает какой-то бред. Кажется все объявлено правильно, почему же тогда не работает?
C++
1
2
3
4
5
6
7
Przedzial& operator+(const Przedzial& lol,const Przedzial& lol1)
{
    Przedzial n;
n.low=lol.low +lol1.low;
n.up=lol.up + lol1.up;
return n;
}

Вопрос решил , просто нужно было убрать &.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2013, 09:21     Перегрузка оператора ввода
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.03.2013, 09:21     Перегрузка оператора ввода #18
Цитата Сообщение от Starfalll Посмотреть сообщение
Вопрос решил , просто нужно было убрать &.
Просто возвращалась ссылка на локальный объект, который переставал существовать после выхода из метода, поэтому получался мусор. В данном случае нужно возвращать по значению, тогда копия создаётся.
Yandex
Объявления
11.03.2013, 09:21     Перегрузка оператора ввода
Ответ Создать тему
Опции темы

Текущее время: 13:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru