【问题标题】:C++ Referencing an objects current state within another objectC++ 在另一个对象中引用一个对象的当前状态
【发布时间】:2012-11-24 02:49:02
【问题描述】:

我已经搜索了这个问题的答案,并尝试了许多解决方案,包括前向声明、指针和引用。我确定我只是在某处使用了不正确的语法。在浪费了很多时间之后,我决定转向堆栈溢出。

我正在尝试编写我的第一个 CPP 应用程序作为学习经验。现在我有一个 Player 和一个 Ball 对象。我的 Ball 对象必须能够访问我的 player 对象中的一些成员变量和方法。我一直无法弄清楚如何做到这一点。下面是我的代码的一个极其简化的版本。我已经注释了特别重要的代码。

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();
}

播放器.hpp

#ifndef PLAYER_HPP
#define PLAYER_HPP

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

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

Player.cpp 不应该真的那么重要。

球.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

球.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;
}

【问题讨论】:

    标签: c++ object pointers reference forward-declaration


    【解决方案1】:

    当您说player 时,您的意思是指与当前ball 对象在同一个playstate 对象中的player 完全相同吗?如果是这样,您想先设置该链接,则无法自动完成。

    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);
    

    您还需要使用指针来使用播放器,因为它是指向播放器对象的指针。

    您确实需要在 Ball 类上方对 Player 进行前向声明。上面的 Playstate 是不必要的。

    另外,您的播放器似乎没有 GetPosition 函数,我假设它是您忘记在上面包含的公共成员函数。

    【讨论】:

    • 感谢您的回答。您假设玩家是 PlayState 中的同一玩家是正确的。我没有包含一些功能来尝试减少我所问的问题中的一些空间:) 我现在正在尝试实施您的解决方案。你能为我解释一下下面的语法吗? PlayState::PlayState() :ball(&amp;player) 特别是 :ball()
    • 它是一种在构造函数中初始化成员的方法,是调用成员/基类构造函数所必需的,更多信息可以在cprogramming.com/tutorial/initialization-lists-c++.htmlstackoverflow.com/a/8523361/1520364找到
    • 好的,谢谢。请问有没有办法在不使用初始化列表的情况下做到这一点?您提供的解决方案使用玩家初始化了球对象。这种设置的问题是 Ball 对象有时可以在没有附加玩家对象的情况下存在。我正在寻找一种不涉及用另一个对象初始化任何一个对象的解决方案。我认为对我来说更好的解决方案是将播放器引用传递给需要使用它的特定函数,或者可能有一个存储播放器的成员变量,我可以在需要时设置它。
    • 我已经解决了这个问题。我相信我的问题是我的前向声明。它声明了,但我没有包含正确的头文件,所以我的对象从未定义过。
    • @user1881255,是的,你可以按照你的建议去做,基本上你需要在正确的时间正确的实例才能调用函数,初始化列表是让你当前的设计工作所需要的,但你可以随心所欲地改变它。是的,至少包括在 ball.cpp 中需要 player.hpp
    猜你喜欢
    • 2015-10-08
    • 2018-07-28
    • 2017-01-23
    • 2012-11-25
    • 2016-10-04
    • 1970-01-01
    • 2012-10-21
    • 2020-05-02
    • 2013-02-18
    相关资源
    最近更新 更多