![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Martin_8 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 16.10.2006 Где: Минск Репутация: нет Всего: нет |
Здравствуйте, что-то я совсем запутался с перегрузкой =.
При компиляции этого кода возникает шибка 'operator =(my_string)' must be a member function. Не могу понять в чём её причина, помогите, пожалуйста, разобраться. Код набирался в билдере.
|
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Martin_8,
Оператор присваивания должен быть членом класса. Заметь, тоже самое тебе говорити и компилятор. |
|||
|
||||
| Martin_8 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 16.10.2006 Где: Минск Репутация: нет Всего: нет |
Так ведь прототип operator = описан в классе. Или я чего-то не понимаю? |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| Kuvaldis |
|
||||||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 11 Всего: 61 |
Martin_8,
Вместо
Поставь
В реализации метода
P.S. Совет: хорошо разберить со ссылками, константными- неконстантными. Это очень нужно для рационального расходования памяти и передачи параметров в функции. в частности и в методы. Т.е. my_string& operator=(my_string x); Лучше написать my_string& operator=(const my_string& x); Зачем нам копировать в стек в локальные параметры х, если можно передать адрес этой переменной? Причем из-за const изменить ее уже нельзя (защита включена) Это сообщение отредактировал(а) Kuvaldis - 16.10.2006, 22:32 -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
||||||
|
|||||||
| Martin_8 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 16.10.2006 Где: Минск Репутация: нет Всего: нет |
Спасибо
Это сообщение отредактировал(а) Martin_8 - 16.10.2006, 22:32 |
|||
|
||||
| Kuvaldis |
|
||||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 11 Всего: 61 |
Martin_8,
что-то вроде этого
P.S. Почитай толковую литературу. Мой совет: Дейтел: Как программировать на С++ Это сообщение отредактировал(а) Kuvaldis - 16.10.2006, 22:38 -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
||||
|
|||||
| Martin_8 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 16.10.2006 Где: Минск Репутация: нет Всего: нет |
to Kuvaldis
Ещё раз спасибо за компетентный ответ |
|||
|
||||
| niknor |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 21.4.2006 Где: РОССИЯ, Набережны е челны Репутация: нет Всего: нет |
А почему при перегрузке одних операторов исп-ся friend, при перегрузке же других &(Ну в смысле в самом классе, аа не как дружественные)?
И хотелось бы уточнить при каких. Заранее спасибо |
|||
|
||||
| Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 11 Всего: 61 |
niknor,
Большинство операций можно перегружать как при помощи friend, так и через методы класса. Исключение составляют операторы ввода и вывода (<< и >>). Например, бинарные операции. Для такой операции важно, чтобы параметр слева был элементом класса. например, класс string
При написании в программе суммы двух строк s1 и s2 s1 + s2 преобразовывается в s1.operator+(s2). s1 - s2 преобразовывается в operator - (s1, s2); cout << s1 - это не cout.operator<<(s1) вызывается дружественная функция operator<< (cout, s1). Заметь, слева стоит не объект класса string Данную возможность friend можно использовать, например, для перегрузки выражения, когда слева стоит не элемент класса например, s1 = "abc" + s2; здесь перегружаем оператор + таким образом String operator + (char* s, const string& r); Т.е. чуть большая функциональность получается Это сообщение отредактировал(а) Kuvaldis - 16.10.2006, 23:16 -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
| Martin_8 |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 16.10.2006 Где: Минск Репутация: нет Всего: нет |
Kuvaldis,
Я всё исправил, как Вы написали и все, разумеется, работает. Но не могли бы Вы прояснить один момент. При вызове метода
Откуда берётся этот мусор и как это можно побороть ? Это сообщение отредактировал(а) Martin_8 - 17.10.2006, 00:29 |
||||
|
|||||
| Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 11 Всего: 61 |
Martin_8,
выложи свой исправленный вариант кода -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
| EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
посмотри сколько итераций делает цикл при выводе. Похоже на то, что лишнии итерации -> выходишь за пределы массива -> мусор.
Это сообщение отредактировал(а) EvgenZ - 17.10.2006, 09:44 -------------------- <удалено администрацией форума> |
|||
|
||||
| niknor |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 21.4.2006 Где: РОССИЯ, Набережны е челны Репутация: нет Всего: нет |
Предлагаю выводить в цикле посимвольно, до тех пор пока не начнется "мусор". Хоть и мухлёж но сработать должно
|
|||
|
||||
| JackYF |
|
||||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
niknor, а как ты определишь - где мусор, а где нет
Kuvaldis, в твоем примере - или не только в твоем: Смысл в классе my_string печатать какую-то левую строчку? Что за семантика такая!
Вывод строки по идее должен выглядеть:
Естественно, при этом внутри метода должен использоваться член класса str. То есть строка выводит себя. А то что же у вас получается: строка может содержать, а выводить другое Добавлено @ 16:39 Да, и еще вопрос на засыпку: чем в классе занимается переменная str2? И где она удаляется? А для того, чтобы не было мусора, так после посимвольного копирования строки надо, как минимум, еще записать в соотвествующую позицию в строке завершающий нуль. Добавлено @ 16:40 Я имел в виду "Строка может содержать ОДНО, а выводить другое". |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |