我正在尝试用C++实现一个简单的GUI组件。“Button”类存在于一个与主程序完全解耦的库中。我希望能够传递一个函数指针到一个单击后可以运行的按钮。
我取得了一些成功,直到我把“button”从一个结构体移到了类中,以提高可读性和可扩展性。我认为它的工作纯粹是偶然的,因为现在我遇到了非常随机的问题。
我基本上有这样的东西:
typedef void(BaseMenu::*ClickAreaCallback)(Button*);
struct Message{
ClickAreaCallback func;
Button* clickArea;
BaseMenu* funObj;
};
从我的子类BaseMenu的类中,我做了如下操作:
cb = (ButtonContainer::ClickAreaCallback)&TileSelectorScreen::setTileMode;
并设置:
ClickAreaCallback to &cb (as well as funObj)
然后,我通过执行以下操作在“单击”时运行它:
m->funObj->*m->func)(m->clickArea);
这显然是错误的,因为我读到过传递非静态成员函数并期望它们运行的问题。
那么,我正在做的事情是不可能的吗?我想要的是通过使用普通C而不使用boost或使用-std=c11来实现的吗?我将自己限制在非常基础的东西上,这样我仍然可以在许多平台上编译。
简而言之:我想要一个简单的方法,从一个对它所调用的类一无所知的类中调用函数。
先谢谢你了。
2条答案
按热度按时间cu6pst1q1#
原则上,指向成员的指针没有错,例如,见以下代码:
但这看起来像是一个概念上的错误。你不应该需要回调。按钮应该派生自基类,并有虚拟成员函数来做特定的事情。
下面的例子演示了继承而不是回调的用法。注意,ButtonToggle是一个在按钮内部存储信息的例子,ButtonNotify是一个通知菜单的按钮的例子。
7ajki6be2#
您可以使用std::function实现此目的,例如:
“on_release”参数是可选的,默认值为不执行任何操作的lambda函数。
下面是如何使用一行代码创建这样的元素(使用lambda函数):