![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Mal Hack |
|
||||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 2 Всего: 261 |
Задание написать класс вот такой:
Вот что есть:
Видимо я, ввиду того, что впервые с VS.NET работаю и с С++ на таком уровне, не могу понять как грамтно сделать перегрузку. Т.е. идет несоответствие типов. Начиная с +=, + и SubString. Выдает: Access Violation или 1> error C2297: '+=' : illegal, right operand has type 'String *' 1> error C2114: '+=' : pointer on left; needs integral value on right На строке Str1 += Str2; Как правильно сделать? Вроде бы с примерами из книжки Поплавской совпадает... |
||||
|
|||||
chipset |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 164 |
Прибавляешь указатель к указателю. Нужно так: (*Str1) += (*Str2) либо как-нибудь вот так Str1->operator +=(*Str2); --------------------
|
||||
|
|||||
Mal Hack |
|
||||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 2 Всего: 261 |
ВОт функция перегрузки оператора +=
В помеченной строчке возникает ошибка при запуске:
При этом, символы, если обращаться как s[5] или this[i] читаются. Но записать я не могу. В чем я ошибаюсь? |
||||
|
|||||
bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Ты неправильно определяещь этот метод, надо:
Таким образом ты не имеешь права менять переменную справа от оператора. Не забывай, что String & s и String s - это разные вещи. Этот метод я бы реализовал так:
Это сообщение отредактировал(а) bsa - 14.5.2006, 21:11 |
||||
|
|||||
Joss |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 19.3.2006 Репутация: 1 Всего: 1 |
А почему модифицируется s? Ведь S1 += S2 - сокращенная запись S1 = S1 + S2. А вообще лучше написать так:
При этом дотжны быть перегружены операции = и +. А ошибка, на мой взгляд, вот почему: в выделеной строке индексируется указатель на String. Его сначала нужно разыменовать:
Кстати обращаться через this не обязательно. Можно просто Str[i]. |
||||
|
|||||
Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 2 Всего: 261 |
bsa, вся проблема в том, что сделать надо жестко по заданию... Хотя я уже давно понял, что оно - корявое.
|
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
не верен семантически лучше operator+ (-,...) реализовывать через operator+= (-=,...) и делать friend-ом если невозможно работать через интерфейс +лучше параметры передавать по const-ссылке Добавлено @ 21:23 Joss опередил -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Mal Hack, у тебя в задании реализация записана?!? Это вряд ли. Если же ты про const, то можно его опустить, но ты должен иметь в виду, что += в данном контексте не должна менять свой параметр. А ты пытался его поменять, тем более, что переменная цикла i у тебя шла по диапазону допустимому для this, но не для s.
И вообще, зачем так мудрить? Алгоритм сложный, перегруженый. А работы всего на 4 строчки: выделить дополнительную память, скопировать добавляемую строку в конец, увеличить размер текущей строки, вернуть ссылку на себя. |
|||
|
||||
bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Mal Hack,
может на реализацию MFC CString взгляни ( ...\MFC\SRC\STRCORE.CPP ). и вместо for(i=...) старайся memcpy использовать |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
или std::string ![]() -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Ужас-то какой... Констукторы написаны неправильно, операторы сравнения тоже. Тут вам и утечки памяти и удаление несуществующей... Короче, полный комплект. Наверно, проще не исправлять здешние ошибки, а написать заново весь класс.
|
|||
|
||||
UnrealMan |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Это сообщение отредактировал(а) UnrealMan - 16.5.2006, 21:29 |
||||||
|
|||||||
Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 2 Всего: 261 |
UnrealMan, это учебная прога и сдавать ее не мне... Человек этого не объяснит...
|
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
А то что есть - работать не будет. Придется выбирать.
![]() |
|||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Добавил чуток комментариев. Может, так понятней будет :-)
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |