2014-10-05 2 views
-3

Я новичок в 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 все экземпляры класса называемые Сущность с переменными 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); 
} 

и г ++ компилятор выплевывает: «запрос на члена` ущерб „в` p_enemys [я]“, который является не-агрегатного типа` недействительным * '»

Я не нужно использовать массивы конкретно любой помощь очень ценится.

Изменения сделаны, спасибо @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

Каков тип 'AA'? – gldraphael

+0

Просто понял, что это было немного неинформативно. AA, AB, AC, AD и Terbil - все экземпляры класса Entity –

ответ

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* сек, когда это возможно.

+0

изменено void * p_Enemys [10]; к вектору p_Enemys [10]; теперь он говорит: s Quest \ Terbil quest basic.cpp | 149 | error: 'class std :: vector ' не имеет имени с именем 'x' | Я использую вашу отредактированную версию цикла for for. –

+0

@GarrettHale, на какую строку вы получаете эту ошибку? – gldraphael

+0

@GarrettHale вы можете поделиться определением структуры/класса 'Entity'? – gldraphael