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

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

Восстановить пароль Регистрация
 
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
12.09.2013, 21:34     Перегрузка операторов: что к чему? #1
Здравствуйте, не могу разобраться с сабжем.
Вот здесь во втором примере, например, что за char[256] data? Каким именно образом этот член класса учавствует в перегруженном операторе "==" ?

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

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

Помогите, плз...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.09.2013, 21:34     Перегрузка операторов: что к чему?
Посмотрите здесь:

Перегрузка операторов C++
перегрузка операторов C++
C++ перегрузка операторов >>,<<,[]
C++ Перегрузка операторов
Перегрузка операторов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Бендерродригез
Сгибальщик
 Аватар для Бендерродригез
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;
}
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 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;
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 ?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
13.09.2013, 12:11     Перегрузка операторов: что к чему? #5
andrejap, слева this, справа - аргумент.

C++
1
2
obj == obj2 // this - obj , X - obj2
obj2 == obj // this - obj2 , X - obj
Бендерродригез
Сгибальщик
 Аватар для Бендерродригез
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)
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],
то куда копать?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
13.09.2013, 23:25  [ТС]     Перегрузка операторов: что к чему? #9
Да, Вы правы. Как раз собрался отписаться, что так и решил проблему. Спасибо!
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
15.09.2013, 17:31  [ТС]     Перегрузка операторов: что к чему? #10
Здесь наткнулся на утверждение, что оператор << должен быть вне класса.
Почему, объясните, плз? Да, там есть пояснение в след. предложении; тогда спрошу почему в случае членства в классе должен быть лишь один параметр перегрузки?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
15.09.2013, 21:36     Перегрузка операторов: что к чему? #11
Цитата Сообщение от andrejap Посмотреть сообщение
почему в случае членства в классе должен быть лишь один параметр перегрузки?
Потому что первый параметр (левый операнд) - это сам объект.
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";
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
15.09.2013, 23:04     Перегрузка операторов: что к чему? #13
andrejap, а что мешает написать show_date(os)?
Так то глупо получается: часть данных добавляешь в один поток, часть - в другой.

Добавлено через 1 минуту
Цитата Сообщение от andrejap Посмотреть сообщение
А как тогда void-функции (напр., Isbn::show_isbn());подать на return os ?
Никак, если я конечно всё правильно понял...
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) ?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
15.09.2013, 23:16     Перегрузка операторов: что к чему? #15
Цитата Сообщение от andrejap Посмотреть сообщение
Вы говорите сделать ostream& Date::show_date(ostream& os) ?
не обязательно. Только если хотите такой "однострочный" синтаксис item.dreg.show_date(cout) << "Book is in library\n";
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
15.09.2013, 23:19  [ТС]     Перегрузка операторов: что к чему? #16
gray_fox, ок, тогда поделитесь, пожалуйста, еще каким-нибудь вариантом?

Не по теме:

Честно говоря, еще до iostream не дошел (след. глава)...

gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
15.09.2013, 23:20     Перегрузка операторов: что к чему? #17
Можно же просто сделать, навроде
C++
1
2
3
4
5
6
7
8
9
10
11
os << item.num.show_isbn()
        << "Author is:\n" << item.author << "\nDate of copyright registration:\n";
item.dreg.show_date(os);
 
if (item.on_hands) {
   os << "Book is on hands now\n";
} else {
   os << "Book is in library\n";
}
 
return os;
это на вскидку, я не знаю, что там у вас эти методы делают.
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
15.09.2013, 23:26  [ТС]     Перегрузка операторов: что к чему? #18
Значит такие вещи как os << item.num.show_isbn(), os << "Book is on hands now\n" не будут отображены на экране, пока не будет отработана инструкция return os ?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
15.09.2013, 23:37     Перегрузка операторов: что к чему? #19
Цитата Сообщение от andrejap Посмотреть сообщение
Значит такие вещи как os << item.num.show_isbn(), os << "Book is on hands now\n" не будут отображены на экране, пока не будет отработана инструкция return os ?
Это не зависит от того, возвращается или нет ссылка на поток. Возвращают ссылку на поток для того, что бы можно было дальше использовать перегрузку << в одном выражении:
C++
1
std::cout << book1 << std::endl << book2 << std::endl ...
можно представить как вызовы ф-й (предположив, что они все реализованы не как члены класса):
C++
1
operator <<(operator <<(operator <<(operator <<(std::cout, book1), std::endl), book2), std::endl) ...
Добавлено через 2 минуты
Т.е. operator << первым аргументом принимает ссылку на поток, и если твоя функция возвращает что-то другое, то использовать её таким образом будет уже нельзя
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2013, 19:46     Перегрузка операторов: что к чему?
Еще ссылки по теме:

Перегрузка операторов C++
Перегрузка операторов! C++
C++ Чему будет равно значение выражения после выполнения операторов?

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

Или воспользуйтесь поиском по форуму:
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
16.09.2013, 19:46  [ТС]     Перегрузка операторов: что к чему? #20
Мерси, буду обдумывать.

Добавлено через 19 часов 44 минуты
Делаю эти цепочки вывода, но получается вот что:
oi44.tinypic.com/1z4vfqa.jpg
Почему выводится число 0x605508 ? Непечатный символ что-ли какой-то? И, кстати, попуталась очередность вывода элементов: значение "1.1.1999" аж никак не должно быть первым...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ostream& Date::show_date(ostream& out) const {
 
    return out << d << '.' << m << '.' << y << '\n';
 
}
 
ostream& Isbn::show_isbn(ostream& out) const {
 
    return out << "ISBN number:\n" <<
            n1 << '-' << n2 << '-' << n3 << '-' << x << '\n';
 
}
 
ostream& operator <<(ostream& os, const Book& item) {
    if (item.on_hands == false)
        return os << item.num.show_isbn(os)
        << "Author is: " << item.author << "\nDate of copyright registration: "
            << item.dreg.show_date(os) << "\nBook is in library\n";
    
    else return os << item.num.show_isbn(os)
        << "Author is: " << item.author << "\nDate of copyright registration: "
            << item.dreg.show_date(os) << "\nBook is on hands now\n";
}
Подскажите, плз.
Yandex
Объявления
16.09.2013, 19:46     Перегрузка операторов: что к чему?
Ответ Создать тему
Опции темы

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