|
1 / 1 / 0
Регистрация: 03.01.2019
Сообщений: 11
|
|||||||||||
Перегрузка операторов для матрицы05.11.2019, 20:09. Показов 7671. Ответов 15
Изучая перегрузки операторов столкнулся с такой проблемой:
По заданию нужно перегрузить "+", "-", "*", "=" для матриц. С присваиваниям все получилось, а вот все остальное... Не судите строго Matrix.h
0
|
|||||||||||
| 05.11.2019, 20:09 | |
|
Ответы с готовыми решениями:
15
Матрицы - перегрузка операторов >> и << Классы, матрицы, перегрузка операторов, дружественные функции Перегрузка операторов для list |
|
913 / 339 / 135
Регистрация: 18.07.2017
Сообщений: 1,485
|
|
| 06.11.2019, 11:21 | |
|
В яндексе не пробовал искать?
https://metanit.com/cpp/tutorial/5.14.php https://www.bestprog.net/ru/20... rs-ru/#q07 Или на форуме? https://www.cyberforum.ru/sear... d=16280504
0
|
|
|
1 / 1 / 0
Регистрация: 03.01.2019
Сообщений: 11
|
|
| 06.11.2019, 17:13 [ТС] | |
|
Пробовал, но нигде не было примера с матрицами или что-то подобное
0
|
|
|
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,368
|
|
| 06.11.2019, 17:20 | |
|
0
|
|
|
1 / 1 / 0
Регистрация: 03.01.2019
Сообщений: 11
|
|
| 06.11.2019, 21:50 [ТС] | |
|
Но деструктор удаляет все поля или я чего-то не знаю?
0
|
|
|
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,368
|
||
| 06.11.2019, 23:31 | ||
|
нельзя удалять содержимое матрицы вне деструктора. это ведет к ошибкам
то же самое касается memoryAllocation(int n, int m) нельзя создавать контент вне конструктора. эти два метода должны делать противоположное - создавать и уничтожать.
0
|
||
|
1 / 1 / 0
Регистрация: 03.01.2019
Сообщений: 11
|
|
| 07.11.2019, 17:50 [ТС] | |
|
Я сделал проверку для того, чтобы узнать одинаковый ли размер у матриц. Отнимать матрицы разных размеров нельзя. Согласен, метод ничего не вернет, если они разные.
Если нельзя создавать и удалять вне конструктора, как менять размер матрицы?
0
|
|
|
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,368
|
||
| 07.11.2019, 18:05 | ||
|
правильное поведение - кинуть исключение. знаешь как разбиваются самолеты? вот из-за таких ошибок а что если тебе надо перемножить миллион таких матриц? каждый раз будешь проверять и писать в консоль?
0
|
||
|
1 / 1 / 0
Регистрация: 03.01.2019
Сообщений: 11
|
|
| 07.11.2019, 18:33 [ТС] | |
|
Это обычное задание, которое дают в колледже. Мне не нужно обрабатывать такой объем информации
0
|
|
|
913 / 339 / 135
Регистрация: 18.07.2017
Сообщений: 1,485
|
|||||
| 07.11.2019, 18:59 | |||||
|
Не по теме: Компилятор не запрещает, значит можно) Можно, конечно каждый раз создавать новую, инициализировать, а старую удалять, но времени и памяти это займет больше.
1
|
|||||
|
1 / 1 / 0
Регистрация: 03.01.2019
Сообщений: 11
|
||||||
| 07.11.2019, 19:25 [ТС] | ||||||
|
Вот все конструкторы и деструктор
Дело в том, что перегрузка = работает (в конструкторе и деструкторе есть вывод, который указывает на их вызов) Но если вызвать +, -, * все летит к чертям. До этого я возвращал ссылку из методов, как я понял, это было не правильно, так как все переменные удаляются после завершения функции. Попробовал вернуть объект - та же проблема...
0
|
||||||
|
913 / 339 / 135
Регистрация: 18.07.2017
Сообщений: 1,485
|
||||||||||||||||||||||||||||||||
| 07.11.2019, 21:56 | ||||||||||||||||||||||||||||||||
|
Операторы не работают из-за двойного выделения памяти.
Давайте рассмотрим что происходит у вас в коде...
2) Выполняются все необходимые операции над ней. 3) Вызывается конструктор копирования (который у вас не определен) для возвращаемого значения. Из-за чего на стеке оказывается неправильная копия матрицы buffer 4) Вызывается деструктор для buffer 5) Выход из функции 6) Вызов деструктора для копии, которая передана через стек. Лечится созданием конструктора копирования Matrix.cpp
https://habr.com/ru/post/61132/ https://habr.com/ru/post/31346/ Добавлено через 45 секунд А вцелом операторы не работают из-за двойного выделения памяти. Давайте рассмотрим что происходит у вас в коде...
2) Выполняются все необходимые операции над ней. 3) Вызывается конструктор копирования (который у вас не определен) для возвращаемого значения. Из-за чего на стеке оказывается неправильная копия матрицы buffer 4) Вызывается деструктор для buffer 5) Выход из функции 6) Вызов деструктора для копии, которая передана через стек. Лечится созданием конструктора копирования Matrix.cpp
https://habr.com/ru/post/61132/ https://habr.com/ru/post/31346/
1
|
||||||||||||||||||||||||||||||||
|
1 / 1 / 0
Регистрация: 03.01.2019
Сообщений: 11
|
||||||
| 07.11.2019, 21:56 [ТС] | ||||||
|
main.cpp
Консоль: Matrix(): 010FF830 Matrix(): 010FF81C Matrix(): 010FF808 Matrix a: 5 5 5 5 5 5 5 5 5 Matrix b: 2 2 2 2 2 2 2 2 2 Matrix(): 010FF6DC ~Matrix(): 010FF6DC = A:\путь (процесс 13760) завершает работу с кодом -1073741819... Знак "=" указывает на вызов перегрузки.
0
|
||||||
|
913 / 339 / 135
Регистрация: 18.07.2017
Сообщений: 1,485
|
||||||||||||||||
| 07.11.2019, 22:03 | ||||||||||||||||
Сообщение было отмечено l0lik как решение
Решение
А вцелом операторы не работают из-за двойного выделения памяти.
Давайте рассмотрим что происходит у вас в коде...
2) Выполняются все необходимые операции над ней. 3) Вызывается конструктор копирования (который у вас не определен) для возвращаемого значения. Из-за чего на стеке оказывается неправильная копия матрицы buffer 4) Вызывается деструктор для buffer 5) Выход из функции 6) Вызов деструктора для копии, которая передана через стек. Лечится созданием конструктора копирования Matrix.cpp
https://habr.com/ru/post/61132/ https://habr.com/ru/post/31346/
1
|
||||||||||||||||
|
1 / 1 / 0
Регистрация: 03.01.2019
Сообщений: 11
|
|
| 07.11.2019, 22:18 [ТС] | |
|
Спасибо, все заработало, программа не ломается.
Вопрос, конструктор копирования вызывается неявно перед концом метода? Добавлено через 11 минут assemberist помог в решении проблемы, тема закрыта
1
|
|
|
913 / 339 / 135
Регистрация: 18.07.2017
Сообщений: 1,485
|
||||||
| 07.11.2019, 22:21 | ||||||
|
Он вызывается всегда когда новый объект строится на основе другого.
Например так
1
|
||||||
| 07.11.2019, 22:21 | |
|
Помогаю со студенческими работами здесь
16
Перегрузка операторов для контейнера Перегрузка операторов не для объектов Перегрузка операторов для списков Перегрузка операторов для класса Перегрузка операторов для классов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет
значение производной при заданном х
Логарифм записывается как: (x-2)log(x^2+2) -. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|