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

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

Войти
Регистрация
Восстановить пароль
 
 
Starfalll
0 / 0 / 0
Регистрация: 09.03.2013
Сообщений: 32
#1

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

10.03.2013, 15:21. Просмотров 748. Ответов 17
Метки нет (Все метки)

Данные вводятся в виде [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;
}
Но что-то эта перегрузка не работает. Компилируется и зависает.Хотя подобная перегрузка для оператора вывода работает.В чем ошибка?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2013, 15:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка оператора ввода (C++):

Перегрузка оператора ввода - C++
Добрый день, есть вот такая штуковина: // в M.matrix лежат значения элементов матрицы // цикл по 4, потому что квадратная их 4-х...

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

Перегрузка оператора ввода - C++
почему не работает следующий код? class obj { unsigned int book_id; string title; unsigned price; public: obj(string i =...

Перегрузка оператора ввода - C++
Всем привет. Я хочу попробовать написать свой класс string. Вот пока собственно класс:class string { private: char* str; ...

Перегрузка оператора ввода - C++
Добрый вечер, уважаемые форумчане. Возник вопрос о перегрузке оператора ввода. Имеется класс string class String{ ...

Перегрузка оператора ввода, ошибка - C++
struct date_of_birth { int year; int month; int day; date_of_birth(int year =0, int month =0, int day =0):year(year),...

17
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2013, 15:25 #2
const уберите.
0
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)
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2013, 16:07 #4
Увидел... Это что?
C++
1
in >> "[";
Чтение в строковый литерал?

Добавлено через 2 минуты
Читать нужно в переменную.
1
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 нужно убрать в обоих.

Не, я гоню, одно вхождение. Сори.
0
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 вылетает ошибка.Для такого варианта нужно специально перегружать "+"?
0
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;
1
alsav22
5425 / 4820 / 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), тоже специально.
2
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
0
alsav22
5425 / 4820 / 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, так есть ещё и неявное приведение типов. Конструктор с одним параметром есть?
0
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. извините если задаю похожие вопросы , просто совсем недавно взялся за классы и еще не все сразу понимаю
0
alsav22
5425 / 4820 / 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)
{
 
}
0
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;
 
}
0
alsav22
5425 / 4820 / 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);
0
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 нету
0
10.03.2013, 20:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2013, 20:37
Привет! Вот еще темы с ответами:

Перегрузка оператора ввода вывода - C++
Есть два хэдера(header.h и Array.h) и исполняемая программа main.cpp в которой я как раз и обращаюсь к оператору ввода Array.h ...

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

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

Перегрузка оператора ввода вне класса - C++
вечер добрый. можно ли так делать? #include <iostream> struct point { int x, y; }; std::istream & operator >>...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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