Я пытаюсь создать нулевой конец массива объектов, подобных этому
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;
Цикл доступа должен быть:
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();
}
for (Creature **creature = ...
тогда?
Ваше creature
является указателем на Creature
. Если вы увеличите этот указатель, вы укажете на следующее Creature
за указанным в данный момент, а не на следующий указатель в своей таблице.
Использование:
for (int i=0; creatures[i]!=nullptr; i++) {
creatures[i]->travel();
}
*creature != NULL
std::vector
иstd::unique_ptr
: V.