即使直接分配给 non-NULL 指针,指针也为 NULL

Pointer is NULL even when directly assigned to non-NULL pointer

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

我的 gameObject object 中有一个指针指向一个 object 称为 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 并且按预期工作。所以我最好的猜测是游戏指针在这个过程中的某个地方被取消了引用。可能是我对pass by refrence的理解有问题。

P.S。 游戏对象确实按预期存储在游戏中的向量中。

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

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

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