C ++ новичок: передача указателя b2Body в функцию по ссылке

Насколько я могу судить, я не могу понять, как передать 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);

0

Решение

Если предположить, 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 объект.

1

Другие решения

использование (b2Body*&) передать ссылку на указатель.

0

В вашем звонке вы должны передать адрес указателя, как показано ниже:

 GetContactInfo(hero, ground);

Я советую вам прочитать раздел 4 в этот урок.

0

Используйте ссылку на указатель, чтобы изменить указатель, как указали другие.

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.

Мне нравится первый способ лучше, так как он чище и современнее.

0