【发布时间】: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