С ++ завершенный массив объектов с нулевым символом

0

Я пытаюсь создать нулевой конец массива объектов, подобных этому

void Game::createCreatures(int numCreatures) {
    creatures = new Creature *[numCreatures + 1];
    for (int i = 0; i <= numCreatures; i++) {
        if(i < numCreatures) {
            creatures[i] = new Runner(maze);
        } else creatures[i] = NULL;
    }
}

Затем обращайтесь к ним так

for (Creature *creature = creatures[0]; creature != NULL; creature++) {
    creature->travel();
}

Что я делаю неправильно? Я получаю EXC_BAD_ACCESS, когда пытаюсь "перемещать" существо. Я знаю, что что-то не так с созданием массива, потому что, если я попытаюсь напечатать адрес всех существ, используя мой цикл доступа к циклу, он печатает навсегда. Я знаю, что что-то не так с моей логикой указателя, помогите?

объявление существ - это

Creature **creatures;
  • 0
    *creature != NULL
  • 2
    Если это не задание, серьезно, рассмотрим std::vector и std::unique_ptr : V.
Показать ещё 7 комментариев
Теги:
arrays
null-terminated

2 ответа

1
Лучший ответ

Цикл доступа должен быть:

for (int i = 0; creatures[i] != NULL; i++) {
    Creature *creature = creatures[i];
    creature->travel();
}

Ваша петля обрабатывает creatures[0] как массив существ, но это всего лишь одно существо.

Если вы хотите сделать цикл с арифметикой указателя, это должно быть:

for (Creature **creature = &creatures[0]; *c != NULL; c++) {
    (*creature)->travel();
}
  • 0
    Разве это не было бы for (Creature **creature = ... тогда?
  • 0
    Тогда имеет ли смысл иметь Существа * существа = новое Существо [число], а не существа как Существа ** существа?
Показать ещё 3 комментария
2

Ваше creature является указателем на Creature. Если вы увеличите этот указатель, вы укажете на следующее Creature за указанным в данный момент, а не на следующий указатель в своей таблице.

Использование:

for (int i=0; creatures[i]!=nullptr; i++) {
        creatures[i]->travel();
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню