Не вдаваясь в слишком много ненужных подробностей о большом мультибиблиотечном проекте, над которым я работаю, я бы хотел задать вопрос о конкретном событии, которое произошло в нем. Я использую Luabind, чтобы иметь мой интерфейс кода C ++ с моим кодом Lua, и у меня есть структура классов с наследованием, например, так:
GuiWidget
GuiButton: GuiWidget
Я зарегистрировал оба этих класса с Lua через Luabind. Затем я делаю следующее, где 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
класс для этого конкретного экземпляра. Как оно это делает? Как он берет указатель на виджет и автоматически знает, что конкретный виджет является кнопкой? Я не верил, что это возможно, поэтому мне потребовалось некоторое время, чтобы прийти к этому решению, но я решил, что сделаю снимок в темноте, и это сработало как-то.
Задача ещё не решена.