C ++解除引用实例

时间:2014-10-05 20:10:33

标签: c++ arrays dereference instances

我是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));
    }
}

1 个答案:

答案 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*