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

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

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

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

05.09.2014, 19:54. Просмотров 345. Ответов 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 сделать константой.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2014, 19:54     Создать массив указателей на Person и использовать его со всеми производными классами
Посмотрите здесь:
C++ Зачем нужен массив указателей на функцию и как его использовать?
Создать класс EMPLOYEE, производный от класса PERSON и использовать их для вычисления зарплаты сотрудника C++
Проинциализировать и использовать массив указателей на функции C++
опп класс и массив (создать массив указателей по выборке животных, участвующих в забеге) C++
C++ Создать массив структур "Person"
Создать динамический массив указателей C++
Возможно ли создать массив указателей на перечисления? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rikimaru2013
C++ Game Dev
2399 / 1093 / 237
Регистрация: 30.11.2013
Сообщений: 3,620
05.09.2014, 19:58     Создать массив указателей на Person и использовать его со всеми производными классами #2
C++
1
Person* person = new Person[sz];
Andrej
И целого heap'а мало
93 / 54 / 9
Регистрация: 31.07.2014
Сообщений: 291
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
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
5416 / 4812 / 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++
C++ Создать массив заданной размерности с помощью функции и указателей
Создать массив указателей с возможностью удаления любого элемента C++
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 и использовать его со всеми производными классами
Ответ Создать тему
Опции темы

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