在不涉及我正在处理的大型多图书馆项目的太多无关细节的情况下,我想问一个关于其中发生的特定事件的问题。我正在使用 Luabind 让我的 C++ 代码与我的 Lua 代码接口,并且我有一个具有继承的类结构,如下所示:
GuiWidget
GuiButton : GuiWidget
我已经通过 Luabind 向 Lua 注册了这两个类。然后我执行以下操作,指向类widget
实例的指针在哪里GuiWidget
:
lua_newtable(luaState);
luabind::object(luaState, widget).push(luaState);
lua_setfield(luaState, 2, "widget");
lua_setglobal(luaState, "event");
//This line connects to some other code I wrote that just executes a file and handles errors.
luaMachine->doFile(widget->getUserString("eventMouseButtonClick"));
lua_pushnil(luaState);
lua_setglobal(luaState, "event");
现在,同样的代码片段可以处理从按钮到滚动条甚至整个窗口的任何内容。因此,稍后在 lua 代码中,当单击复选框按钮时,我将这行代码称为:
event.widget:setSelected(not event.widget:getSelected())
这行得通。即使推送的指针是一个GuiWidget
指针,lua 代码也知道要使用GuiButton
该特定实例的类独有的功能。它是如何做到的?它如何获取一个小部件指针并自动知道特定的小部件是一个按钮?我不相信这是可能的,所以我花了一段时间才找到那个解决方案,但我想我会在黑暗中拍摄,它以某种方式起作用。