| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > перегрузка бинарных операторов |
| Автор: skyboy 16.4.2007, 22:00 | ||||||||||||
есть класс. имя, правда, у него немного "неадекватное"
создаю объект класса:
строка
вызывает сообщение об ошибке:
Ну, ладно- думаю я,- получи. И делаю ход конем:
на оператор + не ругается(!), зато сообщает
Будьте добры, поясните, что я не понимаю в логике перегрузки, что допускаю такие ошибки? ------ VC++ 6.0 |
| Автор: archimed7592 16.4.2007, 22:06 |
| operator+ возвращает НЕуказатель, а ты пытаешься засунуть это в указатель... нужно делать *zero + *zero |
| Автор: skyboy 16.4.2007, 22:27 | ||||
а как же перегрузка оператора присвоения: ? идет лесом? так делать нельзя?
не совсем понял мысль. я перегрузил оператор +. по моей внутренней логике, после перегрузки object1+object2 должно складывать не указатели, а вызывать всё тот же object1->operator+(object2). Только неявно. Но, почему-то, не вызывает. Значит моё виденье работы перегрузки операторов неверно. |
| Автор: archimed7592 16.4.2007, 22:27 |
| и не должен - это вполне себе нормальное имя ф-ции ;) зы. в идеале, толку от *zero + *zero нету - они складываются, но результат игнорируется... пиши *a = *b + *c или *a+=*b |
| Автор: skyboy 16.4.2007, 22:28 |
сам сказал, сам откоммнетился Добавлено через 2 минуты и 32 секунды это я отделил ошибку касательно перегрузки оператора присвоения от ошибки перегрузки оператора сложения да и пример, если не заметно |
| Автор: archimed7592 16.4.2007, 22:31 | ||||||
Добавлено через 58 секунд тройную! |
| Автор: skyboy 16.4.2007, 22:34 |
поясни, пожалуйста, почему. у меня ведь есть вариант перегрузки оператора + для правого операнда типа charList(без указателя-звёздочки). А слева, как я понял, без разыменовывания не обойтись, да? Добавлено через 2 минуты и 24 секунды вот здесь подробнее. что, неявно вызывается несколько раз? или что? Цыц! Я изучаю перегрузку на простых примерах. Сам её(перегрузку операторов), кстати, считаю злом - интерфейсы куда "прозрачнее" и ортодоксальнее. да и с С++ знаком слабо... |
| Автор: powerfox 16.4.2007, 22:38 |
| skyboy, перегрузка и разыменование не есть одно и то же. |
| Автор: archimed7592 16.4.2007, 22:39 | ||||
| да... можно *zero + zero... про operator =: писать нужно так
а ты из java к нам пожаловал видимо Добавлено @ 22:41 конструктор копирования type var - передача по значению type &var - по ссылке const type &var - по ссылке (объект изменить нельзя) Добавлено @ 22:42 ну и пользуй наздоровье... они медленее правда, ну да ладно |
| Автор: skyboy 16.4.2007, 22:46 |
ээээ.... это ты к чему? спасибо, я уже не мальчик в курсе, что не одно и то же |
| Автор: powerfox 16.4.2007, 22:53 | ||||||
К тому, что этот код не означает, что будет возможно делать:
|
| Автор: skyboy 16.4.2007, 22:54 |
льстишь я что - я бы с радостью. Брата вот выручать приходится const charList &another и charList* another - тут имеется радикальная разница? А вот при использовании такой штуки: объект-результат создастся на стеке, да? если да, то вариант передачи правого операнда const another по ссылке меня удивляет. А как же случай: object1 + (object2 + object3)? при выполнении object2 + object3 будет создан объект(а не указатель на него). Получается при работе object1 + result[object2 + object3] будет сложение указателя на класс(charList* object1) и объекта-значения на стеке(charList result), а перегруженного оператора + нет. Или - и не надо? я прошу даже не столько коррекции кода(мне потом сложнее код писать придется), а именно растолковывания, что я неверно разумею |
| Автор: Daevaorn 16.4.2007, 22:57 |
| Твой оператор работает с объектами, не с указателями. Что тут не понятного? Складывать два указателя ка-то не логично в данном случае |
| Автор: skyboy 16.4.2007, 22:58 | ||
| powerfox, почему не пройдет? тип параметра в сигнатуре перегрузки оператора и тип правого операнда не совпадают разве? Добавлено через 1 минуту и 27 секунд
угу. наконец-то понял, спасибо |
| Автор: powerfox 16.4.2007, 23:00 | ||
| Кстати, public писать каждый раз необязательно (public - метка секции, а не функции). Вот, что будет работать с твоим кодом:
|
| Автор: skyboy 16.4.2007, 23:05 |
| powerfox, ок. Спасибо. понял Сейчас попробую подкорректировать исходный код |
| Автор: powerfox 16.4.2007, 23:12 | ||
Не, стой. Извини, я опять бред написал... |
| Автор: Xenon 16.4.2007, 23:13 | ||
Ну и жесть, вообще, если нормально, то так:
|
| Автор: powerfox 16.4.2007, 23:13 |
| skyboy, про неодназначность я ошибся. Остальное написал верно. |
| Автор: skyboy 16.4.2007, 23:26 | ||
а как быть с случаем
Ведь результат последнего сложения - разве "const charList&"? а не без ссылки разве? усиленно путаю указатели и ссылки |
| Автор: Xenon 17.4.2007, 00:01 |
| Без ссылки. Указатели рекдо складывают и вообще лучше не переопределять арифметики указателей (вычитание указателей необходимо для вычисления количества элементов в том же массива). Если у тебя будут указатели на объекты, то просто разыменуй и все - это лучше чем перегрузить операцию сложения для указателей. Ссылка - грубо говорю синтаксическое упрощение указателя - звездочка сама пририсовывается (разыменовывание) и при передаче фактических параметров не надо писать &. |
| Автор: archimed7592 17.4.2007, 01:16 | ||||
в сущности: иногда ссылка есть указатель, иногда - синоним имени переменной. когда какую сущность выбрать решает компилятор из соображений эффективности. маленький пример:
|
| Автор: Xenon 17.4.2007, 01:39 | ||
| Да, как подметил archimed7592 не обязательно физически будет существовать объект "ссылка", которая ссылается на объект. И еще разница в констатности - у констнатной ссылки типа T, в отличии от констатного указателя, в роли иницилизатора может выступать lvalue типа T, а также не типа T (будет неявное преобразование) и временная переменная, то есть не lvalue (также может и T, а может и не T)
|