我正在使用从未使用过的C ++工具在Arduino上进行实验。我想创建一个类MainScreen(从基类GuiScreen继承),该类具有一个GuiButtons数组。这个想法是,在构建时,MainScreen可以填充其数组,这样每个GuiButton都将具有视觉反馈信息,并且如果选择了GuiButton则指向MainScreen应该执行的功能的指针。然后MainScreen可以简单地响应用户输入,直到调用其析构函数为止。在集思广益有关lambda表达式的用例时,我想到了这个想法。
我遇到的麻烦是,尽管我可以将不捕获的Lambda表达式传递给GuiButton,但该Lambda表达式不能对MainScreen的任何成员变量进行操作。我希望MainScreen执行GuiButton指向的函数,并且希望该函数对MainScreen的私有变量进行操作。我认为可以使用functional
标头完成此操作,但这似乎不适用于Arduino框架。
我看到此工作的唯一其他方式涉及创建一个单例,这是我想要避免的。
如何定义GuiButton,使其可以存储指向MainScreen将执行的lambda函数的指针?如果不可能,那么GuiButton可以存储指向MainScreen成员函数的指针吗?
根据我从Q中获得的信息,这是我的建议:
struct MainScreen;
using callback_ptr_t = void (MainScreen::*)(int, std::string);
struct GuiButton
{
GuiButton(MainScreen* main_screen, callback_ptr_t call_back) :
mCallback(call_back),
mMainScreen(main_screen)
{
}
void buttonPressed(int x, std::string s)
{
if (mMainScreen)
{
(*mMainScreen.*mCallback) (x, s);
}
}
void doSomething()
{
buttonPressed(10, "Hi");
}
private:
callback_ptr_t mCallback;
MainScreen* mMainScreen;
};
struct GuiScreen
{
};
struct MainScreen : public GuiScreen
{
MainScreen()
{
for (int i = 0; i < 3; i++)
{
mButtons.push_back(new GuiButton(this, &MainScreen::CallMeOnceButtonPressed));
}
}
void CallMeOnceButtonPressed(int x, std::string s)
{
std::cout << "Main callback was called with: " << x << " and " << s << std::endl;
}
void doSomething()
{
for (auto btn : mButtons)
{
btn->doSomething();
}
}
private:
std::vector<GuiButton*> mButtons;
};
int main()
{
MainScreen m_s;
m_s.doSomething();
}