C++ const对象中的指针在传递到另一个对象构造函数后正在更改
我的问题是,当我调用userInputManager.m_w->execute()时;在第6行,(使用VC 2017)我得到 我指的是这段代码的第6行:C++ const对象中的指针在传递到另一个对象构造函数后正在更改,c++,constructor,initialization,constants,C++,Constructor,Initialization,Constants,我的问题是,当我调用userInputManager.m_w->execute()时;在第6行,(使用VC 2017)我得到 我指的是这段代码的第6行: 1 Graphics graphics{ window }; 2 Camera camera{ graphics }; 3 const UserInputManager userInputManager{ window }; 4 userInputManager.m_w->e
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行中发生了一些事情,游戏构造函数改变了我的userInputManager,使第6行(与第4行相同)出现异常
注意,我在第3行中设置了userInputManager常量
以下是游戏构造函数的代码:
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;
};
在这个类中,我试图实现本书中概述的命令设计模式:
在构造函数中,我试图将一些命令分配给按钮。我将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类的静态对象。现在一切都很好。我的问题确实与悬而未决的指针有关。但是,我的解决方案是使静态对象成为修复此问题的最佳方法吗?我只是随机想到了它仅供参考,这两个指针(
m_w
和m_a
)都在构造函数返回的那一刻摇摆不定。他们不再指向任何可行的东西代码>对象w
是本地对象。构造函数返回后它就不存在了。@FrançoisAndrieux为什么调用userInputManager.m_w->execute();在创建userInputManager后的第4行中,如果对象不再存在,是否继续工作?(我的第一段代码的第4行)。在无效引用上调用会导致未定义的行为。关于未定义的行为,真正令人恼火的是,未定义的行为,结果可能是任何事情,从看似有效到明显失败,@user4581301是否有办法确保这种情况不再发生在我身上?就像某种c++17的神奇功能。
/* 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() { }
};