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

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

Войти
Регистрация
Восстановить пароль
 
 
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
#1

Перегрузка операторов: что к чему? - C++

12.09.2013, 21:34. Просмотров 775. Ответов 19
Метки нет (Все метки)

Здравствуйте, не могу разобраться с сабжем.
Вот здесь во втором примере, например, что за char[256] data? Каким именно образом этот член класса учавствует в перегруженном операторе "==" ?

Моя задача сводится также к перегрузке оператора "==". Вот как сравнить два объекта класса с тройкой данных-членов на эквивалентность? Я правильно понял, что логичнее перегрузить вышеозначенный оператор?

Я не прошу расписать всю последовательность действий, просто если можно в общих словах что к чему? Тот data, мои классы и т.д.

Помогите, плз...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.09.2013, 21:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка операторов: что к чему? (C++):

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

Перегрузка операторов: что возвращать? - C++
У меня есть класс Rational-рациональная дробь.Не могу перегрузить оператор +=. Вся проблема,скорее всего,что не понимаю что возвращать.Все...

ООП в С++ (наследование, инкапсуляция, полиморфизм, перегрузка операторов): что читать? - C++
Нужно освежить, подзабылось. Были у меня институцкие методички доцента Шеховцова. Хороша вещь, но потерялись. Нужны либо набор...

Чему будет равно значение выражения после выполнения операторов? - C++
1. Чему будет равно значение выражения после выполнения операторов C++: 123 & 321? 2. Чему равно значение выражения после выполнения...

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

Перегрузка операторов - C++
Решите пожалуйсто задачу: Разработайте программу, в которой реализована перегрузка оператора «^». Оператор «^» должен возводить...

19
Бендерродригез
Сгибальщик
42 / 42 / 3
Регистрация: 18.05.2013
Сообщений: 220
Завершенные тесты: 1
12.09.2013, 21:59 #2
Цитата Сообщение от andrejap Посмотреть сообщение
Каким именно образом этот член класса учавствует в перегруженном операторе "==" ?
Самым непосредственным. Если массив одного экземпляра идентичен массиву другого, то и == вернёт true (в примере - 1). А иначе что ты собираешься сравнивать? Адреса указателей на объекты?

Сравниваешь почленно, если все члены обоих объектов равны, то и сами объекты равны.

C++
1
2
3
4
bool YourClass::operator==(const YourClass & X){
if(a == X.a && b ==X.b) return true; // a и b  - члены класса
return false;
}
1
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.09.2013, 22:45 #3
Цитата Сообщение от Бендерродригез Посмотреть сообщение
C++
1
2
if(a == X.a && b ==X.b) return true; // a и b *- члены класса
return false;
C++
1
return a == X.a && b == X.b;
1
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
13.09.2013, 11:04  [ТС] #4
Простите, еще не совсем понял...
Цитата Сообщение от Бендерродригез Посмотреть сообщение
a == X.a && b ==X.b) return true; // a и b - члены класса
a и b - члены какого объекта класса? Тот, который стоит до оператора "==" ?

Например, есть:
C++
1
2
3
4
struct Z {int a; char b;};
 
Z obj; obj.a = 1; obj.b = 'k';
Z obj2; obj2.a = 1; obj.b = 'p';
Если пользоваться Вашим примером и сравнивать obj и obj2, то что здесь будет "const YourClass & X" ? Ссылка на obj или obj2 ?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
13.09.2013, 12:11 #5
andrejap, слева this, справа - аргумент.

C++
1
2
obj == obj2 // this - obj , X - obj2
obj2 == obj // this - obj2 , X - obj
1
Бендерродригез
Сгибальщик
42 / 42 / 3
Регистрация: 18.05.2013
Сообщений: 220
Завершенные тесты: 1
13.09.2013, 19:40 #6
Цитата Сообщение от andrejap Посмотреть сообщение
Простите, еще не совсем понял...

a и b - члены какого объекта класса? Тот, который стоит до оператора "==" ?

Например, есть:
C++
1
2
3
4
struct Z {int a; char b;};
 
Z obj; obj.a = 1; obj.b = 'k';
Z obj2; obj2.a = 1; obj.b = 'p';
Если пользоваться Вашим примером и сравнивать obj и obj2, то что здесь будет "const YourClass & X" ? Ссылка на obj или obj2 ?
Всё зависит от записи.
C++
1
obj == obj2
По ссылке передаётся объект справа то есть obj2. Сия запись эквивалентна
C++
1
obj.operator==(obj2)
1
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
13.09.2013, 22:39  [ТС] #7
Спасибо вам, буду пробовать!

Добавлено через 7 минут
А если на месте применения перегр. оператора возникает такая ошибка:
passing ‘const Isbn’ as ‘this’ argument of ‘bool Isbn::operator==(const Isbn&)’ discards qualifiers [-fpermissive],
то куда копать?
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
13.09.2013, 23:11 #8
Цитата Сообщение от andrejap Посмотреть сообщение
А если на месте применения перегр. оператора возникает такая ошибка:
passing ‘const Isbn’ as ‘this’ argument of ‘bool Isbn::operator==(const Isbn&)’ discards qualifiers [-fpermissive],
то куда копать?
Делать метод константным, если он конечно не меняет состояния объекта
C++
1
bool operator==(const Isbn&) const
1
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
13.09.2013, 23:25  [ТС] #9
Да, Вы правы. Как раз собрался отписаться, что так и решил проблему. Спасибо!
0
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
15.09.2013, 17:31  [ТС] #10
Здесь наткнулся на утверждение, что оператор << должен быть вне класса.
Почему, объясните, плз? Да, там есть пояснение в след. предложении; тогда спрошу почему в случае членства в классе должен быть лишь один параметр перегрузки?
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
15.09.2013, 21:36 #11
Цитата Сообщение от andrejap Посмотреть сообщение
почему в случае членства в классе должен быть лишь один параметр перегрузки?
Потому что первый параметр (левый операнд) - это сам объект.
1
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
15.09.2013, 22:53  [ТС] #12
А не противоречит каким-то правилам в определении перегрузки оператора "<<", где в параметрах есть ostream& os, наряду с return os использать cout?

Почему возник такой вопрос? А как тогда void-функции (напр., Isbn::show_isbn());подать на return os ? Как-то надо их сделать ostream-возвращающими?

Пример кода:
C++
1
2
3
4
5
6
7
8
ostream& operator <<(ostream& os, const Book& item) {
    if (item.on_hands == false)
        return os << item.num.show_isbn()
        << "Author is:\n" << item.author << "\nDate of copyright registration:\n"
            << item.dreg.show_date(cout) << "Book is in library\n";
    else return os << item.num.show_isbn()
        << "Author is:\n" << item.author << "\nDate of copyright registration:\n"
            << item.dreg.show_date(cout) << "Book is on hands now\n";
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
15.09.2013, 23:04 #13
andrejap, а что мешает написать show_date(os)?
Так то глупо получается: часть данных добавляешь в один поток, часть - в другой.

Добавлено через 1 минуту
Цитата Сообщение от andrejap Посмотреть сообщение
А как тогда void-функции (напр., Isbn::show_isbn());подать на return os ?
Никак, если я конечно всё правильно понял...
1
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
15.09.2013, 23:06  [ТС] #14
Что-то подобное пришло в голову, но не смог осмыслить, а поделка получилась:
Цитата Сообщение от andrejap Посмотреть сообщение
item.dreg.show_date(cout)
То есть, Вы говорите сделать ostream& Date::show_date(ostream& os) ?
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
15.09.2013, 23:16 #15
Цитата Сообщение от andrejap Посмотреть сообщение
Вы говорите сделать ostream& Date::show_date(ostream& os) ?
не обязательно. Только если хотите такой "однострочный" синтаксис item.dreg.show_date(cout) << "Book is in library\n";
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2013, 23:16
Привет! Вот еще темы с ответами:

Перегрузка операторов 2 - C++
Пишу класс комплексных чисел. И возникла проблема.Я перегрузил операторы +-*/. Но когда использую их в строке типа a=b+c*d - где все...

Перегрузка операторов С++ - C++
Задание: Написать код на языке С++ где реализуется перегрузка операторов. Тематика: База данных института(студенты, аспиранты,...

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

Перегрузка операторов - C++
Как написать код перегрузки операторов (+= и --) чтобы выполнялось действие v1+=v2--; v1 и v2 - массив чисел


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
15.09.2013, 23:16
Ответ Создать тему
Опции темы

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