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

时间:2018-08-01 19:11:27

标签: c++ constructor initialization const

我的问题是,当我调用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类的静态对象。现在一切正常。我的问题确实与悬空指针有关。但是,使它们成为静态对象的最佳解决方案是我的解决方案吗?我只是随机想起

0 个答案:

没有答案