Насколько я могу судить, я не могу понять, как передать b2Body (объект Box2d) в метод по ссылке и присвоить ему значение.
void GameContactListener::GetContactInfo(b2Body &hero, b2Body &ground, b2Body &enemy) {
b2Body *b1 = thing1->GetBody();
b2Body *b2 = thing2->GetBody();
// EXC_BAD_ACCESS HERE
hero = *b1;
ground = *b2;
}
// elsewhere
b2Body *hero = NULL;
b2Body *ground = NULL;
GetContactInfo(*hero, *ground);
Я могу получить пропуск по ссылке, работая для простого int
типы, но, кажется, что-то не хватает с указателями.
Редактировать, добавив объявление метода:
void GetContactInfo(b2Body& hero, b2Body& ground, b2Body& enemy);
Если предположить, thing->GetBody()
возвращает b2Body*
, затем
void GameContactListener::GetContactInfo(b2Body*& hero, b2Body*& ground) {
hero = thing->GetBody();
ground = thing->GetBody();
}
// elsewhere
b2Body* hero = NULL;
b2Body* ground = NULL;
GetContactInfo(hero, ground);
Обратите внимание, что оба hero
а также ground
укажет то же самое b2Body
объект.
использование (b2Body*&)
передать ссылку на указатель.
В вашем звонке вы должны передать адрес указателя, как показано ниже:
GetContactInfo(hero, ground);
Я советую вам прочитать раздел 4 в этот урок.
Используйте ссылку на указатель, чтобы изменить указатель, как указали другие.
void
GameContactListener::GetContactInfo(b2Body *& hero, b2Body *& ground)
{
b2Body *b1 = thing->GetBody();
b2Body *b2 = thing->GetBody();
// Assign pointer to ref to pointer here.
hero = b1;
ground = b2;
}
// elsewhere
b2Body *hero = NULL;
b2Body *ground = NULL;
GetContactInfo(hero, ground); // Pass pointers
Другой старомодный способ — указатель на указатель:
void
GameContactListener::GetContactInfo(b2Body **hero, b2Body **ground) {
b2Body *b1 = thing->GetBody();
b2Body *b2 = thing->GetBody();
// Assign pointers to pointers.
*hero = b1;
*ground = b2;
}
// elsewhere
b2Body *hero = NULL;
b2Body *ground = NULL;
GetContactInfo(&hero, &ground); // Pass address of pointers.
Мне нравится первый способ лучше, так как он чище и современнее.