Я новичок в 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));
}
}
Вы можете сделать 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 когда бы ни было возможно.