Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 05.09.2014
Сообщений: 8

Создать массив указателей на Person и использовать его со всеми производными классами

05.09.2014, 19:54. Показов 1500. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, это моя первая тема на форуме, поэтому сорри, если что не так.
В местном поиске ничего подобного не нашел. Гугл тоже не помог.

Есть базовый класс Person и два производных: Killer и Sniper.
Собственно, хочу создать массив указателей на Person и использовать его со всеми производными классами.
Проблема в том, чтобы размер массива вводил пользователь.
Если делаю так, то выдает ошибку "значение должно иметь константное значение":

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
short sz, ch;
 
std::cout << "Сколько добавить человек? ";
while (!(std::cin >> sz) || (sz < 1))
{
    std::cin.clear(); std::cin.sync();
}
 
// Ошибка...
Person *person[sz];
 
for (int i = 0; i < sz; i++) {
    std::cout << "Добавить человека: 1 - киллер; 2 - снайпер. ";
    while (!(std::cin >> ch) || (ch > 2) || (ch < 1))
    {
        std::cin.clear(); std::cin.sync();
    }
 
switch (ch) {
case 1:
    person[i] = new Killer;
    break;
case 2:
    person[i] = new Sniper;
    break;
}
Программа нормально работает, если SZ сделать константой.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.09.2014, 19:54
Ответы с готовыми решениями:

Зачем нужен массив указателей на функцию и как его использовать?
народ подскажите пожалуйста, зачем нужен массив указателей на функцию и как его использовать.

Создать класс EMPLOYEE, производный от класса PERSON и использовать их для вычисления зарплаты сотрудника
Базовый класс: ЧЕЛОВЕК (PERSON) Имя (name) – string Возраст (age) – int Создать производный класс EMPLOYEE, имеющий поля: ...

Создать класс EMPLOYEE, производный от класса PERSON и использовать их для вычисления зарплаты сотрудника
Базовый класс: ЧЕЛОВЕК (PERSON) Имя (name) – string Возраст (age) – int Создать производный класс EMPLOYEE, имеющий поля: ...

10
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
05.09.2014, 19:58
C++
1
Person* person = new Person[sz];
0
И целого heap'а мало
 Аватар для Andrej
96 / 57 / 17
Регистрация: 31.07.2014
Сообщений: 291
05.09.2014, 22:43
aesarine, попробуйте готовый контейнер std::vector. На крайний случай std::array.
Вряд ли ваша задача так чешется, чтобы вам работать с памятью напрямую.
0
0 / 0 / 0
Регистрация: 05.09.2014
Сообщений: 8
06.09.2014, 13:06  [ТС]
rikimaru2013, мне не надо сразу выделять память. Надо просто сделать массив указателей, поскольку я не знаю заранее какой будет тип.

Andrej, vector и array не вариант. Надо именно на прямую.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.09.2014, 13:18
Лучший ответ Сообщение было отмечено aesarine как решение

Решение

Цитата Сообщение от aesarine Посмотреть сообщение
мне не надо сразу выделять память. Надо просто сделать массив указателей,
Так и сделайте, немного адаптировав вариант rikimaru2013:
C++
1
Person** person = new Person*[sz]; // выделяем память под sz указателей на Person
1
0 / 0 / 0
Регистрация: 05.09.2014
Сообщений: 8
09.09.2014, 15:41  [ТС]
Tulosba, а как теперь очистить память?

Пробую в цикле по очереди всё вывести и удалить.
Первый элемент выводит нормально, но при удалении вылетает окно с ошибкой:
Exception: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

C++
1
2
3
4
5
for (int i = 0; i < sz; i++)
{
    person[i]->Show();
    delete[]person[i];
}
0
118 / 118 / 41
Регистрация: 14.12.2013
Сообщений: 352
09.09.2014, 15:46
Цитата Сообщение от aesarine Посмотреть сообщение
Надо просто сделать массив указателей, поскольку я не знаю заранее какой будет тип.
если создавать массив указателей на объекты базового класса, то неважно на какой тип конкретный указатель указывает (на базовый или на производный). Поэтому код
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Person* person = new Person[sz];
корректен. и твое удаление не должно вылетать при этом.
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.09.2014, 15:48
Цитата Сообщение от aesarine Посмотреть сообщение
но при удалении вылетает окно с ошибкой:
Память под указатели в массиве выделили? Код покажите.
1
0 / 0 / 0
Регистрация: 05.09.2014
Сообщений: 8
09.09.2014, 15:53  [ТС]
Я так понял, он пытается удалить не тот кусок памяти..
Если вытащить delete из цикла, то delete[]person; работает.
Как сделать удаление элементов в цикле?
0
118 / 118 / 41
Регистрация: 14.12.2013
Сообщений: 352
09.09.2014, 15:53
блин.
Цитата Сообщение от aesarine Посмотреть сообщение
delete[]person[i];
. delete надо без квадратных скобок.
1
0 / 0 / 0
Регистрация: 05.09.2014
Сообщений: 8
09.09.2014, 15:57  [ТС]
Проблема решена. Ошибка была в лишних [] перед delete[i];
Всем огромное спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.09.2014, 15:57
Помогаю со студенческими работами здесь

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей. Вернуть адрес...

Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей
Нужно создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей. Эта специализация...

Проинциализировать и использовать массив указателей на функции
Пытаюсь проинциализировать и использовать массив указателей на функции. Компилятор упорно выдает ошибку, даже если следовать многочисленным...

Создайте класс person. Создайте тип people, описывающий массив элементов типа person.
Создайте класс person. У него должны быть поля: name: string; sex: (&quot;муж&quot;, &quot;жен&quot;); height: 100..220. Кроме того, создайте тип people,...

Создать массив указателей на вещественные числа, создать стеки и помещать в них элементы из массива
В pascal создать массив указателей на вещественные числа. создать стеки и помещать в них элементы из массива: в один стек положительные, в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru