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

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

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

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

05.09.2014, 19:54. Просмотров 326. Ответов 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++ Зачем нужен массив указателей на функцию и как его использовать?
Создать динамический массив указателей C++
C++ Создать массив структур "Person"
C++ Виртуальные функции (создать массив указателей на объекты трех классов)
C++ Создать массив заданной размерности с помощью функции и указателей
C++ Как создать в файле массив указателей фиксированной размерности на строки текста?
Создать массив указателей с возможностью удаления любого элемента C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2303 / 1019 / 232
Регистрация: 30.11.2013
Сообщений: 3,376
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
:)
Эксперт С++
4384 / 3227 / 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
5410 / 4806 / 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++
Создать класс EMPLOYEE, производный от класса PERSON и использовать их для вычисления зарплаты сотрудника 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 и использовать его со всеми производными классами
Ответ Создать тему
Опции темы

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