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

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

Восстановить пароль Регистрация
 
aesarine
0 / 0 / 0
Регистрация: 05.09.2014
Сообщений: 8
05.09.2014, 19:54     Создать массив указателей на Person и использовать его со всеми производными классами #1
Всем привет, это моя первая тема на форуме, поэтому сорри, если что не так.
В местном поиске ничего подобного не нашел. Гугл тоже не помог.

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

Создать динамический массив указателей C++
C++ по поводу указателей. Как правильно задавать массив указателей и его удалять?
C++ Создать массив структур "Person"
опп класс и массив (создать массив указателей по выборке животных, участвующих в забеге) C++
Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2133 / 966 / 222
Регистрация: 30.11.2013
Сообщений: 3,231
05.09.2014, 19:58     Создать массив указателей на Person и использовать его со всеми производными классами #2
C++
1
Person* person = new Person[sz];
Andrej
И целого heap'а мало
 Аватар для Andrej
93 / 54 / 9
Регистрация: 31.07.2014
Сообщений: 293
05.09.2014, 22:43     Создать массив указателей на Person и использовать его со всеми производными классами #3
aesarine, попробуйте готовый контейнер std::vector. На крайний случай std::array.
Вряд ли ваша задача так чешется, чтобы вам работать с памятью напрямую.
aesarine
0 / 0 / 0
Регистрация: 05.09.2014
Сообщений: 8
06.09.2014, 13:06  [ТС]     Создать массив указателей на Person и использовать его со всеми производными классами #4
rikimaru2013, мне не надо сразу выделять память. Надо просто сделать массив указателей, поскольку я не знаю заранее какой будет тип.

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

Создать массив указателей с возможностью удаления любого элемента C++
C++ Возожно ли создать массив указателей на шаблоны функций?
Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей C++

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

Или воспользуйтесь поиском по форуму:
aesarine
0 / 0 / 0
Регистрация: 05.09.2014
Сообщений: 8
09.09.2014, 15:57  [ТС]     Создать массив указателей на Person и использовать его со всеми производными классами #11
Проблема решена. Ошибка была в лишних [] перед delete[i];
Всем огромное спасибо!
Yandex
Объявления
09.09.2014, 15:57     Создать массив указателей на Person и использовать его со всеми производными классами
Ответ Создать тему
Опции темы

Текущее время: 23:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru