【问题标题】:Pointer is NULL even when directly assigned to non-NULL pointer即使直接分配给非 NULL 指针,指针也为 NULL
【发布时间】:2020-11-17 14:07:36
【问题描述】:

好的,很抱歉,如果标题难以理解,我不知道该怎么称呼它。

我的 gameObject 对象中有一个指针,它指向一个名为 game 的对象,并且由 默认一个nullptr。

class GameObject
{
public:
    class Game* game = nullptr;
    GameObject(float x, float y, const std::string &path);
};

然后我在游戏中调用 addGameObject 将游戏对象添加到向量并设置 gameObjects 指向自身的游戏指针 (this)。

void Game::addGameObject(GameObject &gameObject) {
    m_objectList->push_back(gameObject);
    gameObject.game = this;
}

但是在gameObject中,当我在将游戏指针添加到游戏后尝试访问它时,指向游戏的指针始终为空。

void GameObject::update() {
    if(game)
        std::cout << game->deltaT(); // will never be called
}

从游戏中调用gameObject中的更新函数如图:

void Game::update()
{
    for (auto gameObject = m_objectList->begin(); gameObject != m_objectList->end(); gameObject++) {
        // update
        gameObject->update();
    }
}

这就是项目的设置方式。制作了一个游戏,然后制作了一个名为 kappa 的游戏对象,然后将 kappa 添加到游戏中。

int main() {
    Game game(720, 480);
    GameObject kappa(game.getWidth() / 2, game.getHeight() / 2, "../graphics/Kappa.jpg");
    game.addGameObject(kappa);
    

    while (game.isRunnig()) {
        game.update(); // calls all gameObjects added update function
    }
}

我认为 'this' 关键字有问题,但是当使用调试器时,它显示它不是 nullptr 并且按预期工作。所以我最好的猜测是游戏指针在某处被取消引用。我对通过引用的理解可能有问题。

附: gameObject 确实按预期存储在游戏中的向量中。

【问题讨论】:

  • 您在哪个GameObject 上打电话给update?您作为参数传递给addGameObject 的那个还是您复制到m_objectList 中的那个?
  • 您的问题确实应该包含minimal reproducible example - 目前有太多未知数无法正确回答
  • 您将gameObject 的副本推回m_objectList 并更改引用的值(这可能在addGameObjectcall 之后被丢弃。您应该在复制之前添加指针或改为更改m_objectList.back().game。投票以拼写错误结束
  • 您分享的代码中没有显示问题的原因。请提供minimal reproducible example
  • @UnholySheep 我正在通过 m_objectList 调用它。但老实说,我认为它们是同一个变量。

标签: c++ visual-studio pointers null pass-by-reference


【解决方案1】:

将 GameObject 添加到 m_objectList 时,会复制该 GameObject 的值,因此添加后所做的任何更改都毫无价值,因为 Game 对象只是副本的磨损。

使用指针向量解决了这个问题。

void Game::addGameObject(GameObject& gameObject) {
    GameObject* go = &gameObject;
    go->game = this;
    m_objectList->push_back(go);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 2015-01-12
    相关资源
    最近更新 更多