Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
aesarine
0 / 0 / 0
Регистрация: 05.09.2014
Сообщений: 8
#1

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

05.09.2014, 19:54. Просмотров 353. Ответов 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2014, 19:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создать массив указателей на Person и использовать его со всеми производными классами (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
rikimaru2013
C++ Game Dev
2436 / 1130 / 240
Регистрация: 30.11.2013
Сообщений: 3,687
05.09.2014, 19:58 #2
C++
1
Person* person = new Person[sz];
0
Andrej
И целого heap'а мало
94 / 55 / 9
Регистрация: 31.07.2014
Сообщений: 291
05.09.2014, 22:43 #3
aesarine, попробуйте готовый контейнер std::vector. На крайний случай std::array.
Вряд ли ваша задача так чешется, чтобы вам работать с памятью напрямую.
0
aesarine
0 / 0 / 0
Регистрация: 05.09.2014
Сообщений: 8
06.09.2014, 13:06  [ТС] #4
rikimaru2013, мне не надо сразу выделять память. Надо просто сделать массив указателей, поскольку я не знаю заранее какой будет тип.

Andrej, vector и array не вариант. Надо именно на прямую.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
06.09.2014, 13:18 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от aesarine Посмотреть сообщение
мне не надо сразу выделять память. Надо просто сделать массив указателей,
Так и сделайте, немного адаптировав вариант rikimaru2013:
C++
1
Person** person = new Person*[sz]; // выделяем память под sz указателей на Person
1
aesarine
0 / 0 / 0
Регистрация: 05.09.2014
Сообщений: 8
09.09.2014, 15:41  [ТС] #6
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
mss307
118 / 118 / 25
Регистрация: 14.12.2013
Сообщений: 352
09.09.2014, 15:46 #7
Цитата Сообщение от aesarine Посмотреть сообщение
Надо просто сделать массив указателей, поскольку я не знаю заранее какой будет тип.
если создавать массив указателей на объекты базового класса, то неважно на какой тип конкретный указатель указывает (на базовый или на производный). Поэтому код
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Person* person = new Person[sz];
корректен. и твое удаление не должно вылетать при этом.
1
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.09.2014, 15:48 #8
Цитата Сообщение от aesarine Посмотреть сообщение
но при удалении вылетает окно с ошибкой:
Память под указатели в массиве выделили? Код покажите.
1
aesarine
0 / 0 / 0
Регистрация: 05.09.2014
Сообщений: 8
09.09.2014, 15:53  [ТС] #9
Я так понял, он пытается удалить не тот кусок памяти..
Если вытащить delete из цикла, то delete[]person; работает.
Как сделать удаление элементов в цикле?
0
mss307
118 / 118 / 25
Регистрация: 14.12.2013
Сообщений: 352
09.09.2014, 15:53 #10
блин.
Цитата Сообщение от aesarine Посмотреть сообщение
delete[]person[i];
. delete надо без квадратных скобок.
1
aesarine
0 / 0 / 0
Регистрация: 05.09.2014
Сообщений: 8
09.09.2014, 15:57  [ТС] #11
Проблема решена. Ошибка была в лишних [] перед delete[i];
Всем огромное спасибо!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2014, 15:57
Привет! Вот еще темы с ответами:

опп класс и массив (создать массив указателей по выборке животных, участвующих в забеге) - C++
Здравствуйте! Есть задача... вкратце. Нужно создать массив указателей по выборке животных участвующих в забеге. Это Лошадь, Крокодил,...

Создать массив структур "Person" - C++
Создать массив структур &quot;Person&quot; (фамилия, имя, отчество, пол, возраст, занятость), записать в бинарный файл. Вывести на экран содержимое...

Создать динамический массив указателей - C++
Создать динамический массив указателей для сохранения двумерного массива А в динамической памяти. Составить программу для подсчета...

Как правильно задавать массив указателей и его удалять? - C++
Т.е., например создаю указатель: TPoint *p_Point=NULL; а если массив? TPoint *p_MassPoint; //=?; как массив обнулить не ясно ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.09.2014, 15:57
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru