Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
Рэмбо комнатный
103 / 103 / 99
Регистрация: 05.03.2017
Сообщений: 511
1

Перегрузка операторов <<, >>

22.08.2017, 16:40. Показов 530. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
у меня есть класс, к примеру
C++
1
2
3
4
5
6
7
8
template <typename type>
class ls
{
private:
   type val;
public:
   ls() { val = NULL; }
}
как для него перезрузить операторы ввода и вывода?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.08.2017, 16:40
Ответы с готовыми решениями:

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this
Добрый день . Помогите понять принцип работы перегрузки операторов. объясните пожалуйста в...

Перегрузка операторов
Решите пожалуйсто задачу: Разработайте программу, в которой реализована перегрузка оператора...

Перегрузка операторов /=, +=, -=
Добрый день. Есть 3 дроби F1, F2, F3 и нужно перегрузить оператор /=, у меня это выглядит так: ...

перегрузка операторов
Товарисссчи, что значит запись: CVector2D::operator+(CVector2D const&amp; v1)const файл *срр и чем...

7
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
22.08.2017, 17:01 2
Цитата Сообщение от GeFacle Посмотреть сообщение
перезрузить операторы ввода и вывода?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <fstream>
 
template <typename type>
class number
{
private:
    type _value;
public:
    number(const type value = 0) : _value{value} {}
 
    friend std::ostream& operator << (std::ostream &output, const number &other) { output << other._value; return output; }
    friend std::istream& operator >> (std::istream &input, number &other) { input >> other._value; return input; }
};
 
int main()
{
    number <int> superNumber;
    std::cin >> superNumber;
    std::cout << superNumber;
}
0
Рэмбо комнатный
103 / 103 / 99
Регистрация: 05.03.2017
Сообщений: 511
22.08.2017, 17:38  [ТС] 3
Notoriously, разве
C++
1
friend
обязательны?

Добавлено через 7 минут
и желательно, можете расписать что есть что? а то я вижу, что вы делаете, но не понимаю
0
Любитель чаепитий
3744 / 1800 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
22.08.2017, 17:42 4
Цитата Сообщение от GeFacle Посмотреть сообщение
обязательны?
если отсутствуют геттеры, то да, иначе функция никак не получит данные из приватных полей класса.
0
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
22.08.2017, 18:02 5
Цитата Сообщение от GeFacle Посмотреть сообщение
и желательно, можете расписать что есть что? а то я вижу, что вы делаете, но не понимаю
C++
1
friend std::ostream& operator << (std::ostream &output, const number &other) { output << other._value; return output; }
Перегруженная операция передачи в поток. Принимает в качестве аргументов ссылку на std::ostream с именем output и константную ссылку на number с именем other.
Выводит значение output << other._value;
Функция operator<< возвращает output как ссылку на std::ostream . Что разрешает каскадирование операции вывода.

Добавлено через 1 минуту
По std::istream& operator >> все аналогично std::ostream& operator <<
0
308 / 271 / 220
Регистрация: 14.11.2016
Сообщений: 1,049
22.08.2017, 18:18 6
C++
1
friend std::ostream& operator << (std::ostream &output, const number &other);
std::ostream &output - левый операнд
const number &other - правый операнд

Если бы можно было делать что-то наподобие такого:
C++
1
std::ostream std::ostream::operator << (const number &other);
...указывать левый операнд. Но так делать нельзя!
При использовании подобной конструкции возвращаемый_тип operator оператор (правый_операнд);
подразумевается то, что левым операндом ВСЕГДА будет объект класса для которого реализуется перегрузка.
По этому используем конструкцию friend возвращаемый_тип operator оператор (левый_операнд, правый_операнд);
0
Рэмбо комнатный
103 / 103 / 99
Регистрация: 05.03.2017
Сообщений: 511
22.08.2017, 18:34  [ТС] 7
так как правильно то?
0
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
22.08.2017, 19:21 8
GeFacle,
Вам же написали. Перегружать ввод / вывод можно только дружественной функцией, так как функция-член всегда принимает первым операндом адрес самого объекта - тот самый this. А здесь нам нужно принять первым операндом поток, с которым мы работаем.
std :: cin и std :: cout - также объекты классов и они и являются "левым операндом" при перегрузке операторов вывода.
Но вы можете не делать ее дружественной, как написал GbaLog-.

Добавлено через 17 минут
Вот перегрузка операторов ввода/вывода где используется оба варианта - и дружественная функция и обычная.
Для обычной функции, как выше упомянул, GbaLog-, необходим так называемый геттер - функция, предоставляющая доступ к закрытым данным пользователю (в данном случае пользователь - функция, перегружающая оператор).
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
#include <iostream>
#include <fstream>
 
template <typename type>
class number
{
private:
    type _value;
public:
    number(const type value = 0) : _value{value} {}
 
    type get() const { return _value; }
 
    friend std::istream& operator >> (std::istream &input, number <type> &other) { input >> other._value; return input; }
};
 
template <typename type>
std::ostream& operator << (std::ostream &output, const number <type> &other)
{
    output << other.get();
    return output;
}
 
int main()
{
    number <int> superNumber;
    std::cin >> superNumber;
    std::cout << superNumber;
}
Уточняйте, что именно неясно.
0
22.08.2017, 19:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.08.2017, 19:21
Помогаю со студенческими работами здесь

Перегрузка операторов
Всем привет. Читаю Страуструпа, дошел до перегрузки операторов и наткнулся там вот на такое...

Перегрузка операторов
Есть у меня свой тип рациональных дробей, и вот мне надо перегрузить оператор &quot;+&quot; таким образом,...

Перегрузка операторов
Создайте класс Fraction (обыкновенная дробь), в котором реализовать перегрузку: оператора...

перегрузка операторов
Всем привет. Дошел до темы перегрузки операторов и возникло два вопроса. Первый: Чем отличается...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru