массивы — C ++ разыменование экземпляра

Я новичок в C ++, и я пытаюсь высушить мой код, например:

void gethit () {
Gert.hitbox(AA.x, AA.damage);
Gert.hitbox(AB.x, AB.damage);
Gert.hitbox(AC.x, AC.damage);
Gert.hitbox(AD.x, AD.damage);
Gert.hitbox(Terbil.x, Terbil.damage);
}

AA, AB, AC, AD и Terbil являются экземплярами класса Entity с переменными x и уроном.

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

void * p_enemys[10];

p_enemys[0] = &AA;
p_enemys[1] = &AB;
p_enemys[2] = ∾
p_enemys[3] = &AD;
p_enemys[4] = &Terbil;

Просто интересно, как я мог вызвать функцию из экземпляра через массив, я пытался сделать

for(int i = 0; i < 10; i++;) {
Gert.hitbox(p_enemys[i].x, p_enemys[i].damage);
}

и компилятор g ++ выплевывает: «запрос на повреждение элемента в p_enemys [i], который имеет неагрегированный тип void *»

Мне не нужно использовать массивы, особенно любая помощь очень ценится.

Изменения сделаны, спасибо @gldraphael!

vector <Entity*> p_Enemys(10);

void gethit () {
for (int i = 0; i < 10; ++i) {
Entity * ienemy = (Entity*) p_Enemys[i];
Gert.hitbox((ienemy->x), (ienemy->damage));
}
}

-3

Решение

Вы можете сделать std::vector следующее:

std::vector <Entity*> p_Enemys(10);

Назначающая часть остается прежней:

p_enemys[0] = &AA;
p_enemys[1] = &AB;
p_enemys[2] = &AC;
p_enemys[3] = &AD;
p_enemys[4] = &Terbil;

Затем вы можете пройти через p_enemys следующее:

for(auto i : p_enemys) {
Gert.hitbox(i->x, i->damage);
}

Так что же вы пропустили?
Массив был объявлен как массив void*
Итак, в цикле, p_enemys[i] вернул void*,

Также доступ к членам класса / структуры осуществляется с помощью оператора разыменования ->, Вы использовали оператор членства . вместо.

Так что этот код должен был работать вместо:

for(int i = 0; i < p_enemys.size(); i++;) {     //
Entity * ienemy = (Entity*) p_enemys[i];    // cast the void* into a Entity*
Gert.hitbox(ienemy->x, ienemy->damage);
}

Как правило, избегайте void*s когда бы ни было возможно.

1

Другие решения


По вопросам рекламы [email protected]