C++ const对象中的指针在传递到另一个对象构造函数后正在更改

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

我的问题是,当我调用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->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() { }
};