|
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
|
|
Написать перегрузку оператора "минус" для строк20.04.2016, 06:05. Показов 9277. Ответов 31
Метки нет (Все метки)
Такой вопрос, для строк нужно написать оператор "минус", что это значит? Если оператор "+" конкатенация строк, то что такое оператор "минус"? Можно пример?
0
|
|
| 20.04.2016, 06:05 | |
|
Ответы с готовыми решениями:
31
Общие символы для двух строк(своего класса) через перегрузку оператора Создать перегрузку оператора == для класса vect Как реализовать перегрузку оператора «=» для односвязного списка? |
|
261 / 209 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
|
|
| 20.04.2016, 06:28 | |
|
я полагаю
abcdefgh - fgh = abcde
1
|
|
|
Модератор
|
|
| 20.04.2016, 06:28 | |
Сообщение было отмечено Nike1995 как решение
Решение
Nike1995, это т.н. перегрузка операторов. Вы можете написать свой вариант оператора минус, т.е. задать ему произвольное поведение (какое Вам больше нравится).
Мне видятся логичными четыре варианта:
1
|
|
|
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
|
||||||
| 20.04.2016, 08:17 [ТС] | ||||||
|
Вот, я написал несколько перегруженных операторов:
0
|
||||||
|
261 / 209 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
|
|
| 20.04.2016, 09:16 | |
|
Nike1995, гляньте
std::basic_string::operator=
0
|
|
|
Комп_Оратор)
|
|||||||||||
| 20.04.2016, 10:02 | |||||||||||
|
Nike1995, идея перегрузить операцию вычитания для строк - плоха. Семантически, это будет уродством. Возможно, смысл задания в том, чтобы Вы это поняли. Ну, или это естественный ход мысли для тех, кто Вам задал это задание.
Дело в том, что для строк уже есть перегруженная операция "+". У неё есть такие перегрузки как:
если c=a+b то a=c-b О том, что c+(-b)=c-b=a я уже молчу. Так как тут неплохо бы перегрузить унарный минус( ). Нездоровая идея, я же говорю.Но если отбросить последнее соображение, то для строк c и b где a=c-b я искал бы в конце строки c подстроку b (возможно односимвольную для перегрузки с символом) и если нашёл, - удалил, а на нет и суда нет. Реализация несложна, но объёмиста. Спартанский вариант (который мог бы быть полезен в любом случае) подсчитывать разность длин:
1
|
|||||||||||
|
Модератор
|
|||||||
| 20.04.2016, 11:39 | |||||||
|
По-моему, вполне понятный код:
1
|
|||||||
|
Комп_Оратор)
|
|||||||
| 20.04.2016, 14:13 | |||||||
|
А вот писать: уже не удобно, - не помещается на полке корня ничего существенного. Вот и выходит, что корни 2-й и 3-й степени, это 2 костыля. И детей ставят на них с малолетства. Имхо, не ко всему нужно привыкать.
![]() Хотя - дело вкуса. Если начать с того, что операция "+=" - вполне соответствует духу ОП, так как является собственностью экземпляра, а "+" это "дружественная" примочка которую нельзя вызывать от экземпляра потому, что она должна была бы быть методом класса вычислительная цепь (выражение - минимум из 2-х операндов), то можно уйти в дебри. Предлагаю считать, что вычитание строк как символьных цепочек - дело вкуса. Кому-то нравится, кому-то нет.
1
|
|||||||
|
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
|
|
| 20.04.2016, 14:35 [ТС] | |
|
С минусом я разобрался, вопрос был в том почему в операторе = обязательно const в параметрах указывать?
0
|
|
|
Комп_Оратор)
|
||
| 20.04.2016, 16:26 | ||
1
|
||
|
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
|
||||||
| 20.04.2016, 16:40 [ТС] | ||||||
|
Вот весь код. тут перегружаются операции "+", "-", "=", "*".
0
|
||||||
|
Комп_Оратор)
|
|||||||
| 20.04.2016, 17:25 | |||||||
|
Напишите конструктор копии (я не нашёл). Операции перегрузите и для сложения с символом char и с c-строкой char*. Причём дружественные варианты (где символ или си-стока - первый операнд) тоже перегрузите.
1
|
|||||||
|
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
|
|
| 20.04.2016, 17:41 [ТС] | |
|
Интересно, кто может объяснить, почему после добавления конструктора копирования у меня все заработало. Т.е. до добавления программа работала через раз, а теперь все хорошо. Я только начал С++ изучать, такие моменты хотелось бы понимать. Спасибо))
0
|
|
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
||
| 20.04.2016, 18:01 | ||
Сообщение было отмечено Nike1995 как решение
РешениеПо умолчанию объект просто копируется почленно. Т.е. в твоем случае без явно определенного конструктора копирования скопируется только адрес (буфера для строки) и длина строки. При этом данные, на которые указывает указатель, скопированы не будут. И при этом же возникнет опасность двойного освобождения памяти, т.к. теперь у нас есть несколько объектов, содержащих адрес одной и той же памяти. Уничтожился один - вызвался деструктор и освободил память. Второй объект после этого уже в невалидном состоянии, т.к. указатель внутри него "протух". Итого получалось, что ты всегда возвращал "протухшие" объекты из своих операторных функций, т.к. локальный объект (внутри функции) освобождал память, которую они с твоей легкой руки делили какое-то время. А вообще - читай Мейерса и Дьюхэрста, чуть позже Саттера, чтобы научиться применять C++ без ежесекундного отстрела ног.
2
|
||
|
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
|
|
| 21.04.2016, 18:38 [ТС] | |
|
Теперь другой вопрос. Вот написал я перегрузки операций. Сказали, что нужно сделать так, чтобы они не зависели от типа данных. т.е. я так понимаю, что нужно сделать базовый класс, а от него производный- шаблонный. Только как это делать, я не понимаю, именно как связать шаблонный и базовый классы
0
|
|
|
Комп_Оратор)
|
||||
| 21.04.2016, 22:37 | ||||
|
Посмотрите в том примере, перегрузки сложения Int+int и int+Int. Перегрузки операций сложения char*+string, string+char*, char+string и string+char не должны вызвать трудностей. Операции operator, по сути, это функции и перегружаются они схожим образом. ![]() Добавлено через 2 часа 41 минуту Nike1995, Вы молчите и значит не понимаете. Или я не понимаю. Вот тут: Не зависимость от типа данных у операции сложения означает, что она перегружена для разных типов и в разной последовательности. Тогда с чем бы (из того что вы перегрузили) Вы не складывали Вашу строку операцией '+' она будет складываться. А шаблон и не дал бы ничего путного. Логика сложения строки со строкой и строки с символом разная, что тут шаблон может сделать без кривизны?
0
|
||||
|
Модератор
|
||
| 22.04.2016, 08:29 | ||
|
0
|
||
| 22.04.2016, 08:38 | |
|
Не по теме: Предлагаю использовать оператор минус для выкладывания постов на киберфорум.
0
|
|
|
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
|
|||||||||||
| 24.04.2016, 00:14 [ТС] | |||||||||||
|
Вот дописал программу. Все работает, только вот что. мне сказали, что нужно перегрузить так, чтобы можно было перегружать операции для char* и char т.е, например, конкатинировать как char* с char*, так и char* с char. Я это сделал так, написал конструктор для char* и для char, правильно ли я сделал?
И какие замечания будут по операторам- это очень важно. Хоть и читаю Шилдта- но опыта еще нет. Добавлено через 19 минут Добавлено через 6 минут на мое удивление возможна конкатенация символа и строки. Пример:
0
|
|||||||||||
| 24.04.2016, 00:14 | |
|
Помогаю со студенческими работами здесь
20
Не правильно работает алгоритм вычитания строк при перегрузке оператора "-"(минус) Для какого оператора можно выполнить перегрузку еще раз
Реализовать перегрузку оператора -- для класса "массив вещественных чисел" Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение.
И на уровне агентов добавится между грибами или бактериями взаимодействий.
До того я пробовал подход через многомерные массивы,. . .
|
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Сочетание глобально распределённой вычислительной мощности и инновационных. . .
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|