0 / 0 / 0
Регистрация: 07.10.2019
Сообщений: 78
|
|
1 | |
Как создать полиморфный массив?15.03.2020, 23:44. Показов 5957. Ответов 36
Есть классы A, B, C. А - класс-родитель. B и C дочерние, наследуют от него полный функционал. Как создать массив, который будет в себе иметь обьекты всех типов и как инициализировать элементы такого массива по индексу?(Желательно с примером, но без template и vector, обычные структуры или классы).
0
|
15.03.2020, 23:44 | |
Ответы с готовыми решениями:
36
Создать полиморфный объект и продемонстрировать работу функций На базе набора функций создать полиморфный класс Как создать динамический массив типа string? Как создать класс такого массива? Полиморфный массив |
0 / 0 / 0
Регистрация: 07.10.2019
Сообщений: 78
|
|
16.03.2020, 10:28 [ТС] | 21 |
У меня два вопроса.
1)Это разве не принцип создания матрицы, когда каждый элемент есть началом массива?Если да, тогда почему так? 2)Если класс-родитель не абстрактный, то есть чистых функций у него нету и в одном из дочерних классов не инициализировать метод iAm(), но вызвать его(метод iAm) циклом для всех элементов, компилятор выдаст ошибку, так как либо в В или С он не инициализирован?Если да, то как избежать этой ошибки?
0
|
Комп_Оратор)
|
|
16.03.2020, 10:49 | 22 |
L0M, это необходимое но не достаточное условие, для массива - типа. С точки зрения монолитности, да - горную или лесистую, местность, называют массивом. Столешницу из натурального дуба (данная тема требует сильных аналогий) тоже называют массивом. Но блок памяти в С++ массивом не является. Хотя называют его так частенько. И когда условность такого применения слову "массив" подразумевается, это допустимо. Однако в С++ есть 2 массива - C-style array и std::array<T>. Оба имеют размер времени компиляции.
По духу задания, ТС нужен блок в динамической памяти, так как речь о функционале поддерживающем полиморфную коллекцию. И если коллекция подразумевает свободный набор подтипов, то освободить её от ограничений размера вполне логично. Однако ТС отказывается от шаблонных контейнеров и вы правы в том, что суть вопроса легко показать на простом. И это массив. А суть в полиморфной природе объекта и если идти от "рекомендаций", то контейнер unique_ptr был бы хорош. Но новичку это не надо (по его заявлению). А дух вопроса не понят вами полудух, даже на половину. А упрямства хватает на четверых.
0
|
daslex
|
16.03.2020, 12:28
#23
|
Не по теме: полудух, есть термины быта и есть термины языка. В терминах языка массивы — это T[] и array<T>.
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
|
|
16.03.2020, 12:48 | 24 |
Не по теме: Вообще не понятно к чему этот спор о терминах, если ТС сам попросил решение без вектора в частности и шаблонов вообще? :) Eg0ra1, лучше покажите на примере ваши затруднения, т.к. терминологию употребляете невпопад, поэтому трудно понять точно что у вас не так.
0
|
daslex
|
|||||
16.03.2020, 12:51
#25
|
|||||
Не по теме: полудух,
0
|
0 / 0 / 0
Регистрация: 07.10.2019
Сообщений: 78
|
||||||
16.03.2020, 13:07 [ТС] | 26 | |||||
0
|
Комп_Оратор)
|
|
16.03.2020, 13:15 | 27 |
Eg0ra1, Выделить блок памяти под указатели базового класса сможете? Что делать дальше показал L0M, вот тут: Как создать полиморфный массив?
0
|
0 / 0 / 0
Регистрация: 07.10.2019
Сообщений: 78
|
|
16.03.2020, 13:25 [ТС] | 28 |
Неа
0
|
Комп_Оратор)
|
|
16.03.2020, 16:23 | 29 |
Eg0ra1, раз контейнеров не нужно, то и слёз тоже. Где боевая раскраска и дикая бесстрашная песня? Нужно то всего: пробежать по файлу и посчитать объекты. Потом не закрывать, а выделить память под блок (динамический "массив" указателей). Снова пройти по файлу от начала и прочесть, создавая объекты в куче и перенося указатели в массив. Операторы ввода там какие-то есть. Хотя лучше бы сделать полиморфный метод вызываемый в операторе принимающем ссылку на базовый класс... Или ещё как-то, чтобы не повторять код в каждом операторе.
Eg0ra1, беда в том, что вам не массив полиморфных указателей нужен. Вам нужен массив тех, кто напишет вам программу.
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
|
|
16.03.2020, 16:36 | 30 |
Вот тут вам дали ответ на вопрос: Как перегрузить >> для записи в файл?
0
|
Мозгоправ
|
|
16.03.2020, 16:39 | 31 |
Нет, это не массив массивов.
Смотрите #3, строка 32: A *arr[ARRLEN]; - здесь определяется массив указателей на базовый класс. Цикл (строки 34-40) - это инициализация этого массива: при каждом проходе цикла создаётся экземпляр одного из классов, который инициализируется переменной цикла. Здесь new A((int)i) в куче выделяется память для одного объекта, для которого вызывается конструктор с параметром типа int . Адрес этого объекта заносится в arr[i] .Вы сначала попробуйте. Для того, что бы удалить метод iAm() из класса B или C нужно поставить всего два слеша комментария в начале строки. Кликните здесь для просмотра всего текста
Ошибки не будет ни при компиляции, ни в рантайме. Если метод не переопределён в дочернем классе, то будет вызван метод класса-родителя.
0
|
0 / 0 / 0
Регистрация: 07.10.2019
Сообщений: 78
|
|
16.03.2020, 17:12 [ТС] | 32 |
Я не вы, чтобы просить написать мне программу)
0
|
Мозгоправ
|
|
16.03.2020, 17:45 | 33 |
Ну здесь я пытался донести до человека, что концепция массива настолько базовая, что если опуститься до железа, то голая оперативная память также является массивом минимально адресуемых областей памяти.
На счёт того, что "блок памяти в С++ массивом не является" - вопрос философский. В С++ "блок памяти" - это блок памяти, выделенный malloc() или др. подобной функцией (при выделении памяти по new типизация выполняется сразу). Т.е. после выделения памяти имеем указатель на void с адресом этого блока. Получается, что блок памяти становится массивом в тот момент, когда (1) мы кастим void* к указателю на тип, отличный от void и (2) мы подразумеваем, что данный указатель указывает не на единичный объект, а на несколько объектов, расположенных непрерывно в этом блоке памяти.std::array<T> появился, если не ошибаюсь, только в С++11. До этого обходились и без него. Это скорее синтаксический сахар.
0
|
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,211
|
|
16.03.2020, 17:49 | 34 |
вот всё что вы там понаписали - это и есть демагогия. Куча букв про то, что "массив не вектор".
Запутывание терминами, манипуляция понятиями. А теперь ещё больше букв про то, что это не демагогия Когда vector - всего-лишь набёр обёрток для работы с массивом. В основе у него массив. Работают там все функции с массивом. А всё что он делает: - автоматизирует new/delete - автоматизирует resize - ловит и грамотно обрабатывает ошибки (так чтобы программа не падала) - имеет функции поиска и прочие вспомогательные методы, упрощающие жизнь программисту И всё это он делает с массивом! Теперь, что такое массив, собственно... Я так понимаю, термин map-to-hardware вам не знаком. Массив - это хранение данных напрямую в ячейках памяти. В коде у вас {1,2,3}, а в реальности там ровно также заняты ячейки памяти под №№: 777,778,779 (утрировано). Т.е. массив - это 1-к-1 отражение, как в памяти хранятся данные. И он не может быть каким-то иным в векторе или где-либо ещё. В C/C++ данные в памяти хранятся именно так и никак иначе - они просто занимают ячейки подряд и вы также напрямую с этими ячейками и работаете. Всегда. А уж как вы с ними работаете - через vector, через array или прямо через [] - дело стодвадцатьпятое. Там всего-лишь доп.обёртки для работы со сгруппированными ячейками. С демагогами одна проблема, они никогда не возьмут в толк, что сколько бы бумаги не исписали, а гранит истины поломать невозможно. Истина всегда останется неизменной и, рано или поздно, все иллюзии убьются об этот гранит.
0
|
Комп_Оратор)
|
|
16.03.2020, 18:39 | 35 |
L0M, это настолько же верно как и то, что указатель на любой блок можно скастить к чему угодно. Но массив это тип. Впрочем, ТС как раз нуждается именно в динамическом (так называемом) массиве. Но вопрос же не в этом. Если человек не знает как выделить память и отказывается от контейнеров, то вопрос откуда код. Там нужно всё переписывать, почти.
Это можно и так увидеть.
Мы подразумеваем. Указателю всё едино. У него от природы оператор индексации вшит. Вообще, спор о массивах и указателях - скука. Я вот не врубился ТС писатель или читатель? Там он открывает файл, а потом пытается из него читать? Потом закрывает и просит создать массив данных? Там всё нужно делать почти с нуля. Просто и не интересно.
0
|
Мозгоправ
|
|
16.03.2020, 21:44 | 37 |
М-да... Зря я клавиатуру топтал в стремлении что-то вам объяснить. Вы просто банальный тролль.
1
|
16.03.2020, 21:44 | |
16.03.2020, 21:44 | |
Помогаю со студенческими работами здесь
37
Если можно создать массив TButton, то как создать массив их событий? Полиморфный метод Полиморфный протектор Полиморфный конструктор [C++] Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |