gpt4 book ai didi

c++ - 将 StateMachine 的状态作为参数传递给函数指针 C++ OOP

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:55:54 25 4
gpt4 key购买 nike

我对 C++ 中函数指针的概念还很陌生,所以我不知道如何正确地写下我的问题。请耐心等待。

基本上,我想要做的是创建一个 Button 对象,其构造函数接受一个函数指针作为其参数。该函数指针指向将更改状态机状态的函数。

这是示例代码(它不起作用,并且不相关的位已被剥离)

按钮.h

#include "StateMachine.h"

class Button
{
private:
void (*m_onclickAction)(); //a data member
public:
Button(void (*action)());
};

StateMachine.h(不是我写的,只是授权使用。所以代码应该没有问题,我也不想修改)

#include <map>

template<class E, class T>
class StateMachine
{
public:
typedef void (T::*CallbackOnInitialise)();
typedef void (T::*CallbackOnExit)();
private:
T* m_pOwner;
E m_currentState;

// Maps to store function pointers to state functions.
std::map<E, CallbackOnInitialise> m_statesOnInitialise;
std::map<E, CallbackOnExit> m_statesOnExit;

public:
StateMachine(T* pOwner, E emptyState)
{
m_currentState = emptyState;
m_pOwner = pOwner;
}

void ChangeState(E statenext)
{
//do something to change the state
}
};

所以在我的主程序类中,我可以做这样的事情

#include "Button.h"
#include "StateMachine.h"

//Code to instantiate an StateMachine object goes here
Button* aButton = new Button(aStateMachine->ChangeState(NEW_STATE));

问题是我想不出正确传递 NEW_STATE 的方法,它是 Program 类中声明的枚举,因为函数指针不需要任何参数。我曾尝试对其进行调整,但没有成功。

关于我应该怎么做有什么建议吗?

最佳答案

这里有几个问题。第一个是在您的版本中,您在创建 Button 实例时调用 ChangeState 成员函数。二是m_onclickAction是指向函数的指针,与指向成员函数的指针不同。

为此,我建议您查看 std::functionstd::bind :

class Button
{
std::function<void(int)> m_onclickAction;

public:
Button(std::function<void(int)> action) { ... }
};

然后你可以像这样创建你的按钮:

Button* aButton = new Button(
std::bind(&StateMachine::ChangeState, aStateMachine, NEW_STATE));

关于c++ - 将 StateMachine 的状态作为参数传递给函数指针 C++ OOP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19174162/

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