C ++ Ссылка на текущее состояние объекта в другом объекте

Я искал ответ на этот вопрос все выше и ниже и пытался найти много решений, включая предварительное объявление, указатели и ссылки. Я уверен, что я просто использую неправильный синтаксис где-то. После многих потраченных часов я решил переключиться на переполнение стека.

Я пытаюсь закодировать одно из моих первых приложений CPP как опыт обучения. Прямо сейчас у меня есть объект Player и Ball. Мой объект Ball должен иметь доступ к некоторым переменным и методам-членам объекта моего игрока. Я не смог понять, как это сделать. Ниже приведена чрезвычайно упрощенная версия моего кода. Я прокомментировал код, который особенно важен.

PlayState.hpp

#ifndef PLAYSTATE_HPP
#define PLAYSTATE_HPP
#include "Player.hpp"#include "Ball.hpp"
class Player;
class Ball;

class PlayState
{
public:
PlayState();
Player player;
Ball ball;
};
#endif

PlayState.cpp

#include "PlayState.hpp"
PlayState::PlayState() {
}

void PlayState::update() {

if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))
{
ball.checkCollision();
player.move(1);
}
ball.update();
}

void PlayState::draw()
{
m_game.screen.clear();
m_game.screen.draw( player.getSprite() );
m_game.screen.draw( ball.getSprite() );
m_game.screen.display();
}

Player.hpp

#ifndef PLAYER_HPP
#define PLAYER_HPP

class Player
{
public:
Player();
~Player();

void create();
void setRotation(float);
void setPosition(float, float);
};
#endif

Player.cpp не должен быть настолько важным, чтобы видеть.

Ball.hpp

#ifndef BALL_HPP
#define BALL_HPP

class Player; // I don't think forward declaration is what I need???

class Ball
{
public:
bool picked_up;
bool throwing;

Player *player; // this isn't working

Ball();
~Ball();

bool checkCollision();
};
#endif

Ball.cpp

#include "Ball.hpp"
Ball::Ball() {
Ball::picked_up = false;
Ball::throwing = false;
}

Ball::~Ball() {
}

bool Ball::checkCollision()
{
float ball_position_x = Ball::getPosition().x;
float ball_position_y = Ball::getPosition().y;

// I need to access the player object here.
float x_distance = abs(player.getPosition().x - ball_position_x);
float y_distance = abs(player.getPosition().y - ball_position_y);

bool is_colliding = (x_distance * 2 < (player.IMG_WIDTH + Ball::width)) && (y_distance * 2 < (player.IMG_HEIGHT + Ball::height));

return is_colliding;
}

1

Решение

Когда ты сказал player, ты имеешь ввиду то же самое player то же самое playstate объект как текущий ball объект? Если это так, вы хотите сначала настроить эту ссылку, это не может быть сделано автоматически.

PlayState::PlayState() :ball(&player){ //pass pointer to ball of its player?
}

class Ball
...
Ball(Player *myPlayer);
...

}

Ball::Ball(Player *myPlayer):player(myPlayer) {
...

// I need to access the player object here.
float x_distance = abs(player->getPosition().x - ball_position_x);

Вы также должны использовать указатель для использования проигрывателя, так как это указатель на объект проигрывателя.

Вам нужно предварительное объявление Player над классом Ball. Тот, что выше Playstate, не нужен.

Также у вашего плеера, похоже, нет функции GetPosition, я предполагаю, что это публичная функция, которую вы забыли включить выше.

0

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

Других решений пока нет …

По вопросам рекламы [email protected]