我的问题是,当我调用userInputManager.m_w-> execute();时,在第6行,(使用VC 2017)我得到了
Exception thrown: read access violation. userInputManager.m_w-> was 0xFFFFFFFFFFFFFFFF.
我的意思是这段代码的第6行:
1 Graphics graphics{ window };
2 Camera camera{ graphics };
3 const UserInputManager userInputManager{ window };
4 userInputManager.m_w->execute();
5 Game theGame{camera, userInputManager };
6 userInputManager.m_w->execute();
7 while(window.ProcessMessage() )
请注意,即使是同一行,第4行也没有给我例外。在第5行,Game theGame构造函数中发生了某些事情,该事件正在更改我的userInputManager并使第6行(与第4行相同)给出异常。
请注意,我在第3行中设置了userInputManager常量。
这是Game构造函数的代码:
Game::Game(Camera & camera, const UserInputManager & userInputManager)
:
m_camera{ camera },
m_userInputManager{userInputManager}
{
}
请注意,我将userInputManager作为const引用传入,并将m_userInputManager设置为userInputManager引用。
这是UserInputManager类
class UserInputManager
{
public:
UserInputManager(MainWindow & window)
:
m_window{window}
{
LeftCommand a;
m_a = &a;
UpCommand w;
m_w = &w;
m_w->execute();
}
MainWindow & m_window;
Command * m_w = 0;
Command * m_s = 0;
Command * m_a = 0;
Command * m_d = 0;
};
在此类中,我尝试实现本书概述的命令设计模式:http://gameprogrammingpatterns.com/command.html。
在构造函数中,我试图为按钮分配一些命令。我将LeftCommand分配给m_a,将UpCommand分配给m_w。然后我调用m_w-> execute();就像始终有效的测试一样。
以下是命令的类:
/* Represents game actions. Uses Command pattern */
class Command
{
public:
virtual void execute() = 0;
};
class UpCommand : public Command
{
public:
virtual void execute()
{
executionN++;
}
int executionN = 0;
};
class LeftCommand : public Command
{
public:
virtual void execute()
{
executionN++;
}
int executionN = 0;
};
class NullCommand : public Command
{
public:
virtual void execute() { }
};
现在UpCommand和LeftCommand只是增加一个值以测试函数调用。
这是我在此网站上的第一篇文章。我试图寻找答案,但什至找不到答案。
请让我知道我的帖子是否可以改进或澄清。
谢谢。
编辑1:我更改了LeftCommand a和UpCommand w的本地创建,并使它们成为UserInputManager类的静态对象。现在一切正常。我的问题确实与悬空指针有关。但是,使它们成为静态对象的最佳解决方案是我的解决方案吗?我只是随机想起