Добавление динамического массива - PullRequest
0 голосов
/ 15 мая 2018

Я хотел бы хранить 3 типа унаследованных классов, которые я наследую от базового класса. Я хочу хранить указатели, которые указывают на базовый класс, в списке, который создает динамический массив этих указателей.

Мой список классов:

class list{
int n;
base **array;
public:
    list() :n(0),array(NULL){};

void add(base* x);
~csapatlista(){
for(int i = 0;i<n;i++){
    delete[] array[i];
}
};

Вот моя функция добавления.

 void list::add(base* x){
    base **temp;
    temp = new base*[n+1];
        for(int i = 0;i<n;i++){
        temp[i] = array[i];
            }
    temp[n+1] = x;
    if(array != NULL){delete[] *array;}

    array = temp;
    n += 1;
};

Базовый класс не содержит ничего, кроме 1-2 переменных типа. По какой-то неизвестной мне причине моя программа вылетает или выдает ошибку memtrace, которая указывает, что что-то не так с моей функцией добавления. Также я до сих пор не совсем понимаю, как это может хранить унаследованные объекты, если мы храним только указатели на базовый класс.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 15 мая 2018

Задача

temp = new base*[n+1];

выделяет массив из n + 1 указателей для base. Они проиндексированы [0, n].

temp[n+1] = x;

назначает x на temp[n+1]. n + 1 не находится в пределах [0, n].

Решение

Вы хотите

temp[n] = x;

, чтобы поместить x в последний слот в temp.

Unrelated

if(array != NULL)

не требуется.

delete[] array;

обрабатывает пустой кейс array для вас.

Деструктор не удаляет array, поэтому у вас небольшая утечка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...