0 / 0 / 0
Регистрация: 06.06.2016
Сообщений: 18
|
||||||||||||||||
1 | ||||||||||||||||
Вектор объектов класса04.07.2016, 17:49. Показов 6567. Ответов 16
Метки нет (Все метки)
Всем привет! Несколько недель назад я писал сюда по поводу одной задачи. Она заключается в том, чтобы реализовать класс "Зоомагазин" с полями: тип животного, пол, цена, количество, а также придумать для этого класса функционал. Я решил сделать функции добавления животных в магазин, просмотр списка животных и их покупка. Для того, чтобы удалять животных из списка при покупке, я решил использовать вектор, в котором будут храниться объекты класса. С вектором возникла проблема, так как при выводе полного списка животных в каждой строке таблицы отображаются данные последнего введённого животного. Когда я использовал массив объектов класса, всё отображалось корректно. Подскажите, как решить эту проблему?
Заголовочный файл:
0
|
04.07.2016, 17:49 | |
Ответы с готовыми решениями:
16
Вектор объектов класса Вектор из объектов класса Вектор объектов класса и алгоритмы Вектор объектов пользовательского класса |
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
|
|
04.07.2016, 19:24 | 2 |
у тебя каждый ссылается на определенный участок памяти, а соответственно и изменяет один участок памяти. вот отчего у тебя все и одинаково
Добавлено через 4 минуты лучше не играться с динамической памятью, пока обучаешься
1
|
Модератор
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,714
|
||||||
04.07.2016, 19:31 | 3 | |||||
Использование указателей в данной задаче ничем не обосновано.
И, к тому же, Вы совсем не следите за удалением созданных динамических объектов.
1
|
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
|
|
04.07.2016, 20:07 | 4 |
вот у меня в vs15 почему-то вылетает, если в я деструкторе удаляю, а когда не удаляю-все норм. лучше на более старую перейти?
0
|
0 / 0 / 0
Регистрация: 06.06.2016
Сообщений: 18
|
|
04.07.2016, 20:18 [ТС] | 5 |
Я высвобождал память, но это приводило к ещё какой-то ошибке, видимо одна ошибка привела к другой. Убрал код деструктора в коде для того, чтобы не путаться. Сейчас верну.
0
|
Неэпический
|
|
04.07.2016, 20:29 | 6 |
Всё просто. При удалении одной копии объекта, делается delete в деструкторе,
потом, когда уничтожается другая копия, снова delete и снова для того же адреса.
0
|
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
|
|
04.07.2016, 20:33 | 7 |
0
|
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
|
|
04.07.2016, 22:38 | 8 |
Для использования класса в векторе желательно реализовать копирующие конструктор и оператор присваивания и, так как класс ссылается на какие-то ресурсы (указатели, выделение памяти в куче), то не помешали бы перемещающие конструктор и оператор присваивания. См. правило пяти.
1
|
0 / 0 / 0
Регистрация: 06.06.2016
Сообщений: 18
|
||||||
04.07.2016, 23:28 [ТС] | 9 | |||||
Спасибо всем. Проблема решилась. Есть ещё пара вопросов. Я написал функцию покупки животных, в ней пользователю предлагается выбрать животное из списка и указать сколько таких животных он хочет купить. 1) Если он вводит число, превышающее количество таких животных, то отображается оповещение об этом; 2) если он вводит число, совпадающее с количеством животных, то строка с этим животным удаляется из таблицы; 3) если он вводит число, меньшее количества таких животных, то количество должно уменьшиться на это число. Вопросы по 2 и 3 пунктам. 2) Если из вектора можно удалить только последний элемент, то одной строкой удалить не получится и придётся вручную делать (как я и сделал) или всё-таки есть способ? Может быть нужно использовать другой контейнер, но я не припомню такого, где можно было бы удалить любой элемент. Мой способ тоже не работает, он работал с массивом объектов класса, но здесь не хочет. 3) Как у элемента вектора объектов класса уменьшить значение одного поля объекта, т.е. количества (в моей программе ничего не происходит, количество остаётся прежним).
По поводу деструктора тоже вопрос. Если я не использую динамические переменные, то как высвободить память? Или это нужно только с динамическими переменными?
0
|
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
|
||||||
05.07.2016, 09:54 | 10 | |||||
Если не используете, то не надо освобождать, почитайте про RAII. Также вы можете не объявлять деструктор без надобности (если вам в нём нечего добавить от себя), тогда компилятор сам сгенерирует необходимые конструкторы, операторы присваивания и деструктор. Так же можно компилятору явно указать:
1
|
0 / 0 / 0
Регистрация: 06.06.2016
Сообщений: 18
|
|
05.07.2016, 12:06 [ТС] | 11 |
Спасибо, а как изменить поля класса? В моей задаче мне нужно изменить количество животных при покупке, но мой код на поле количества не влияет. Почитал про правило пяти, но хотелось бы пример реализации.
0
|
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
|
||||||||||||||||||||||||||
05.07.2016, 13:18 | 12 | |||||||||||||||||||||||||
Сообщение было отмечено HEYDEPZHUMblU как решение
Решение
Т.е. вы вызываете функцию
Zoo::buy , покупаете, ещё раз вызываете, выбираете второй пункт меню, а изменение нет? Передавайте вектор по ссылке:
Теперь о "правиле пяти"...
Для того чтобы избежать таких неприятностей нужно определить копирующие конструктор и оператор присваивания:
copy_somedata , если будем использовать семантику перемещения, там где это нужно, разумеется (это очень обширная тема, излагать её тут нет смысла и времени):
1
|
0 / 0 / 0
Регистрация: 06.06.2016
Сообщений: 18
|
|
05.07.2016, 16:39 [ТС] | 13 |
Спасибо огромное за объяснение. Программа заработала корректно. А почему, когда я передаю вектор по ссылке, всё работает, а иначе ничего не происходит?
0
|
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
|
|
05.07.2016, 16:50 | 14 |
На здоровье.
Потому что передаёте его по значению (т.е. в функцию передаётся копия вектора, которая уже никак не связана с вашим исхоным вектором, плюс это ещё и накладно по процессорным ресурсам)
1
|
0 / 0 / 0
Регистрация: 06.06.2016
Сообщений: 18
|
|
05.07.2016, 20:48 [ТС] | 15 |
По поводу деструктора тоже вопрос. Задание заключается в реализации класса, в нём должны быть конструкторы (по умолчанию, c параметрами, копирования), деструктор и свои методы. Я ещё не закончил программу, поэтому конструкторы не все. По условию нужен деструктор, но как мне его использовать, если мои переменные не динамические? Я так понимаю, что можно их сделать динамическими, но тогда и дальнейшие действия с ними подкорректировать.
0
|
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
|
|||||||||||
05.07.2016, 22:22 | 16 | ||||||||||
а обязательно что-то им делать явно? просто объяви его, да и всё.
Добавлено через 16 минут ну или ко всему(старому) добавь копирующий конструктор
и все будет 0к Добавлено через 13 минут и еще одно забыл: также, как и копирующий, определить конструктор перемещения.
1
|
0 / 0 / 0
Регистрация: 06.06.2016
Сообщений: 18
|
|
06.07.2016, 09:54 [ТС] | 17 |
Спасибо, добавлю. С копирующим конструктором и конструктором перемещения пока ещё не очень разобрался, почитаю на эту тему.
0
|
06.07.2016, 09:54 | |
06.07.2016, 09:54 | |
Помогаю со студенческими работами здесь
17
Отсортировать вектор объектов класса по определенному полю Как сделать вектор/массив объектов одного класса с разным <типом> Не удаётся добавить в вектор объектов экземпляры класса (нет подходящего конструктора по умолчанию) Передача объектов дочерних классов через массив объектов родительского класса в функцию Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |