16 / 11 / 6
Регистрация: 18.07.2018
Сообщений: 51
|
|||||||||||
1 | |||||||||||
Динамический массив при наследовании, элементами которого являются объекты класса наследника динамический массив22.07.2018, 11:34. Показов 6282. Ответов 10
Метки нет (Все метки)
Попробовал создать динамический массив, у которого элементы - объекты класса динамический массив, причем использовал класс-наследник от базового, при создании объекта вызывается деструктор и данные стираются, видел такое с указателями, но такого не нашел
0
|
22.07.2018, 11:34 | |
Ответы с готовыми решениями:
10
Динамический массив ,элементами которого являются объекты класса динамический массив Динамический массив указателей на объекты класса Массив: создать одномерный массив, элементами которого являются двумерные массивы, элементами которых являются записи Как создать одномерный динамический массив, элементами которого будут одномерные массивы разной длины? |
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,706
|
|
22.07.2018, 11:46 | 2 |
Зачем ты поля продублировал? Они и так наследуются.
0
|
Комп_Оратор)
|
|
22.07.2018, 13:17 | 3 |
Mikelyndgelo, это не хорошо:
Потому что освобождая: delete[]arr; вы вызываете деструктор базового класса так, что он будет вызван неверно при освобождении такого динамического массива. Фактически, массив наследников даже больше по размерам, чем массив объектов базового класса. Да и запуск базовых деструкторов в невиртуальном режиме (на объектах а не указателях наследника) не должен пройти бесследно. Для корректного удаления (если вы хотите вручную), нужно создать массив указателей на базовый класс. А при удалении - вручную проделитить каждый указатель. После чего вызвать общий делит для всего массива указателей. Я давно не делал ничего подобного руками и пишу по старой памяти. Если соврал, - пусть меня поправят.
1
|
16 / 11 / 6
Регистрация: 18.07.2018
Сообщений: 51
|
|
22.07.2018, 22:28 [ТС] | 4 |
Не очень понял, виртуальный деструктор я использовал, в каком порядке они вызываются я знаю, а что значит вручную, вы имеете ввиду, как мы удаляем двумерный динамический массив или что ,извиняюсь, если вопрос глупый, программированием занимаюсь сам и только 3 месяца, кстати как по-вашему мнению написан код в плане читаемости?
0
|
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|||||||||||||||||||||
22.07.2018, 22:44 | 5 | ||||||||||||||||||||
Нужно очищать arr после конструктора First.
0
|
Комп_Оратор)
|
|
22.07.2018, 22:50 | 6 |
Виртуальные методы работают при вызове через указатель на базовый класс. Однако динамический массив удаляется оператором delete[] на указателе на начало выделенной памяти запуская деструкторы базового класса на объектах которые delete[] будет искать в массиве. Это совсем не тот случай когда деструкторы запускаются на указателях, понимаете?
Для начала, оставьте полиморфное наследование. Оставьте любое. Напишите класс в котором деструктор пишет на экран что-то вроде "I am destuctor". Создайте динамический массив. Удалите его delete[]. Подумайте о том что происходит. Почитайте. А потом возвращаясь к наследованию (полиморфному) задумайтесь о том зачем оно нужно. Наследники имеют разные с базовым классом размеры, - больше обычно и разные между собой также. Они не могут вперемежку размещаться в одном массиве. Но профит от полиморфного поведения именно в возможности вызывать метод на коллекции гарантируя его полиморфное выполнение. Единственный выход, это массив указателей на базовый класс. Где уже сами указатели (объекты массива) указывают на разные полиморфные объекты. Это совсем не то, что Вы сделали инициализировав указатель базового класса массивом объектов наследника.
0
|
16 / 11 / 6
Регистрация: 18.07.2018
Сообщений: 51
|
|
22.07.2018, 23:03 [ТС] | 7 |
Я имел дело с классами динамический массив (двумерными тоже, перегружал операторы в них, почти всегда никуда не глядя, и механизм работы мягко говоря у меня в печенках теперь), а вы можете тогда посоветовать какую-нибудь литературу по данному вопросу, с таким наследованием я столкнулся впервые, обычно везде рассказывают про указатели и этим ограничиваются
0
|
Комп_Оратор)
|
|
22.07.2018, 23:20 | 8 |
Сообщение было отмечено Mikelyndgelo как решение
Решение
Это тоже результат. Осталось переместить это выше.
Mikelyndgelo, то о чём речь есть везде. Вопрос в том, что Вы очень торопитесь. Для начала поймите, что вызывая виртуальный метод (не только деструктор, конечно) на экземляре Вы вызываете его не виртуально. А вызвав на указателе (или ссылке) на базовый класс Вы вызываете метод того объекта на который в данный момент смотрит этот укахатель. Именно для этого в языке который пароноидально относится к приведениям, приведения указателя наследника к указателю базового класса происходит автоматически. Поэкспериментируйте с вызовом полиморфных методов на указателях базового класса безо всяких массивов. А уже потом создавайтк массивы или векторы указателей базового класса и заселяйте их адресами разношерстной полиморфной публики и крутите в цикле запуская полиморфный метод sound() и пусть щенок лает, котёнок мяукает, корова мычит...
1
|
Комп_Оратор)
|
|
22.07.2018, 23:29 | 9 |
Mikelyndgelo, и ещё. Там у Вас конструкторы перемещения вроде. И это хорошо. Если хорошо. Но понимаете ли Вы что в наследнике у Вас уже 2 массива, 2 указателя и 2 поля size? Вы же вызвали базовый конструктор и он всё сделал, но потом Вы затенили имена базового класса именами наследника. Если оно Вам нужно - бог с ним, но я этого не вижу. Обращаться к ним можно через полное разрешение:
First::arr например.
0
|
16 / 11 / 6
Регистрация: 18.07.2018
Сообщений: 51
|
|
22.07.2018, 23:30 [ТС] | 10 |
IGPIGP Спасибо, может реально слишком увлекся и без базы устоявшейся двинулся в никуда
0
|
Комп_Оратор)
|
|
22.07.2018, 23:32 | 11 |
0
|
22.07.2018, 23:32 | |
22.07.2018, 23:32 | |
Помогаю со студенческими работами здесь
11
Двумерный динамический массив (Получить векторный столбец, элементы которого являются наименьшим по модулю столбцов исходной матрицы) Сделать динамический массив структур, причем в структуре так же существует динамический массив Скопировать динамический массив в другой массив только с положительными элементами из первого Дан массив A(N) (N - четное). Сформировать массив B(M), элементами которого являются средние арифметические Массив: Создать новый массив, элементами которого являются все отрицательные элементы массива C Дан массив A(N) (N – четное). Сформировать массив В(М), элементами которого являются средние арифметические соседних Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |