C ++:将成员/ Lambda函数指针存储到不同的结构中

问题描述 投票:0回答:1

我正在使用从未使用过的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成员函数的指针吗?

c++ function-pointers lambdaexpression
1个回答
0
投票

根据我从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();

 }
© www.soinside.com 2019 - 2024. All rights reserved.