11 / 11 / 2
Регистрация: 23.12.2012
Сообщений: 45
|
|||||||||||
1 | |||||||||||
Перегрузка операторов19.11.2013, 20:37. Показов 1656. Ответов 20
Метки нет (Все метки)
Всем Hello world! Изучаю C++, сейчас дошёл до классов, а точнее до перегрузки операторов. Решил в учебных целях написать класс, который может хранить строку, а также прибавлять её к другой строке. И всё бы хорошо, но вот тут для меня открылась частичка волшебства... Я делал перегрузку операторов "+" и "+=" чтоб класс нормально прибавлял строку, которая в объекте, к сторонней строке и удобно записывался (например obj1=obj2+"qwerty" или например obj1+="qwerty"), с оператором "+=" всё норм, а вот оператор "+" у меня никак не хотел прибавлять, он возвращал значение 1 операнда без изменения. Я решил проверить, что может у меня где-то в самой функции не прибавляет строку, и добавил в код проверку (обычный вывод результата) и когда я ввёл проверку всё отлично прибавилось, но когда я удалил проверку, то всё также упорно класс не хотел прибавлять... Вот пример вышесказанного:
classias.h
0
|
19.11.2013, 20:37 | |
Ответы с готовыми решениями:
20
Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this Перегрузка операторов Перегрузка операторов /=, +=, -= перегрузка операторов |
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
|
|
19.11.2013, 20:48 | 2 |
чуть попозже напишу, сегодня делал похожий пример
0
|
3 / 3 / 4
Регистрация: 28.11.2011
Сообщений: 35
|
||||||
19.11.2013, 20:59 | 3 | |||||
Перегрузку оператора "+" как и многих других бинарных операторов лучше делать так:
friend const my_str operator + (const my_str& l, const my_str& r) Вот код, попробуйте, работает ?
1
|
435 / 246 / 43
Регистрация: 05.08.2013
Сообщений: 1,670
|
|
19.11.2013, 21:08 | 4 |
0
|
143 / 52 / 17
Регистрация: 12.11.2013
Сообщений: 162
|
|
19.11.2013, 21:15 | 5 |
проверил, работает, как ни странно.
Оператор += перегружен, имхо за его счёт.
0
|
Модератор
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,714
|
|
19.11.2013, 21:25 | 7 |
Не понятно, почему оно у Вас вообще работает.
Вы возвращаете адрес временного объекта, так делать нельзя. Надо временно заводить объект ТОГО ЖЕ типа: [CPP]friend const my_str operator + (const my_str& l, const my_str& r) { my_str temp_st; strcpy(temp_st.st,l.st); strcat(temp_st.st,r.st); return temp_st; }/CPP]
2
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|
19.11.2013, 21:34 | 8 |
Не по теме: Объект создастся по возвращению из функции. А на обычной системе, на стеке (строка лежит там) ошибки доступа не будет даже вне функции, поэтому нормально отработает. В этом случае конструктор вызовется перед возвращением.
0
|
3 / 3 / 4
Регистрация: 28.11.2011
Сообщений: 35
|
||||||
19.11.2013, 21:35 | 9 | |||||
Оно то работает, хотя правильно наверное будет так
0
|
11 / 11 / 2
Регистрация: 23.12.2012
Сообщений: 45
|
||||||
19.11.2013, 23:30 [ТС] | 10 | |||||
Всем спасибо за ответы, но как тогда быть если я хочу, чтобы оператор "+" возвращал строку, например если в основном коде написать:
0
|
11 / 11 / 2
Регистрация: 23.12.2012
Сообщений: 45
|
|||||||||||
20.11.2013, 00:12 [ТС] | 12 | ||||||||||
Вы имеете ввиду что-то типа этого:
0
|
11 / 11 / 2
Регистрация: 23.12.2012
Сообщений: 45
|
|
20.11.2013, 00:30 [ТС] | 14 |
Выдаёт ошибку на 4 строку:
1>.\check.cpp(15) : error C2662: my_str::returnSt: невозможно преобразовать указатель 'this' из 'const my_str' в 'my_str &' 1> В результате преобразования теряются квалификаторы
0
|
11 / 11 / 2
Регистрация: 23.12.2012
Сообщений: 45
|
||||||
20.11.2013, 00:45 [ТС] | 16 | |||||
0
|
11 / 11 / 2
Регистрация: 23.12.2012
Сообщений: 45
|
|
20.11.2013, 01:02 [ТС] | 18 |
Всё заработало, ух, спасибо, не знал
0
|
Модератор
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,714
|
|
20.11.2013, 12:25 | 19 |
перегрузите оператор
friend const char* operator + (const my_str& l, const char* r)
0
|
11 / 11 / 2
Регистрация: 23.12.2012
Сообщений: 45
|
||||||
20.11.2013, 14:43 [ТС] | 20 | |||||
так?
Не по теме: У меня ассоциации почти как с котом Шрёдингера, только тут, если не заглядывать внутрь самой функции во время выполнения, то там ничего не прибавляет, а если заглянуть (сделать вывод-проверку), то прибавление существует :)
0
|
20.11.2013, 14:43 | |
20.11.2013, 14:43 | |
Помогаю со студенческими работами здесь
20
Перегрузка операторов Перегрузка операторов Перегрузка операторов перегрузка операторов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |