不同类中的C++回调函数

3
这是我的问题, 我有两个类,MainMenuState和MainMenuUI。MainMenuState有一个MainMenuUI成员。 基本上,我想在MainMenuUI中进行所有GUI初始化。
void GameUI::MainMenuUI::initUi()
{
    std::shared_ptr<GUI::Label> testLabel2(new GUI::Label);
    testLabel2->setFont(m_font);
    testLabel2->setText("TestLabel");
    testLabel2->setFontColor(sf::Color(0, 0, 0));
    testLabel2->setFontSize(16);
    testLabel2->setRelativePosition(GUI::Position::RIGHT, GUI::Position::BOTTOM, -5, -5);
    addComponent("label2", testLabel2);



    std::shared_ptr<GUI::MainMenuPanel> mainMenu(new GUI::MainMenuPanel(font));
    mainMenu->setRelativePosition(GUI::Position::MIDDLE, GUI::Position::MIDDLE);
    mainMenu->open();
// Problem !---------------
    /*mainMenu->setPlayButtonCallback([this]{
        requestStackPop(); // This method belongs to MainMenuState's base class and is protected
        requestStackPush(States::AnotherState); // This method belongs to MainMenuState's base class and is protected
    });
    mainMenu->setExitButtonCallback([this]{
        requestStackPop(); // This method belongs to MainMenuState's base class and is protected
    });*/
//--------------------
    addComponent("mainMenu", mainMenu);
}

如您所见,问题是“如何直接在我的MainMenuUI类中设置回调函数?”。朋友类能帮助我吗?
谢谢

你可能想要查看std::mem_fn,以及可能的std::bind或boost:bind。 - Joe
@Joe:我不认为这两件事会有所帮助。实际上,lambda表达式是最干净的方法。这里的问题是回调函数内部的访问权限。 - Lightness Races in Orbit
这不是所有公共方法的重点吗?创建一些公共方法,以便您可以随时访问它们。 - David Haim
1个回答

0

如果您不想将这些方法暴露给外界,您可以创建一个类来访问这些方法并提供这样的接口,并将该类的实例作为回调函数的参数传递:

mainMenu->setPlayButtonCallback([this](Accessor acc){
        acc.requestStackPop(); 
        acc.requestStackPush(States::AnotherState); 
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接