gpt4 book ai didi

c++ - 多态成员函数指针

转载 作者:行者123 更新时间:2023-11-30 02:13:02 26 4
gpt4 key购买 nike

我正在尝试在 DirectX9 中编写一个回调事件系统。我正在尝试使用方法函数指针来触发鼠标点击事件;但我遇到了一些问题。我的游戏使用游戏状态管理器来管理渲染。我所有的游戏状态都派生自基类 AbstractGameState。

我有一个使用这种特定方法的 sprite 对象:

m_NewGameSprite->OnClick(this, &MainMenuState::StartGame);

MainMenuState 是我的游戏所在的当前游戏状态,而 StartGame 是此类的无效方法部分。我想将函数指针存储在我的 sprite 类中的一个变量中,以便我可以在用户单击时执行它。

template <typename T>
void OnClick(GameState* LinkedState, void (T::*EventPointer)())
{
m_LinkedGameState = LinkedState;
m_EventPointer = EventPointer; // <- Doesnt compile
}

我试过向下转换指针,但这并没有真正奏效。

我的 Sprite 类也包含这两个变量

void                (GameState::*m_EventPointer)();
GameState* m_LinkedGameState;

任何帮助将不胜感激

最佳答案

我真的不知道为什么您的作业不起作用,毫无疑问,litb 很快就会解释原因。 Boost.Function是一个漂亮、通用、类型安全和标准的函数对象,几乎在所有情况下都可以用作函数指针的替代品。我会这样做:

typedef boost::function0<void> Event;
Event m_Event;

请注意,事件类现在封装了函数调用的状态,包括您要对其调用的对象。通常你也使用 Boost.Bind创建闭包,但您也可以轻松绑定(bind)到自由函数或其他一些函数对象。

void OnClick(Event &event)
{
m_Event=event;
}

这样调用它:

OnClick(boost::bind(&MainMenuState::StartGame, this));

使用这种方案,您实际上不需要存储“链接的游戏状态”——它被封装在事件对象中。

关于c++ - 多态成员函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1046717/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com