我是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));
}
}
答案 0 :(得分:1)
您可以按如下方式设置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*
。