Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > 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)
|