У меня вопрос для новичка по использованию LuaPlus.
Я смотрю какой-то код здесь внутри конструктора объекта:
m_MetaTable = g_pApp->m_pLuaStateManager->GetGlobalState()->GetGlobals().CreateTable("EventManager");
m_MetaTable.SetObject("__index", m_MetaTable);
m_MetaTable.RegisterObjectDirect( "TriggerEvent", (EventManager *)0, &EventManager::TriggerEventFromScript );
m_MetaTable.RegisterObjectDirect( "RegisterEventType", (EventManager *)0, &EventManager::RegisterScriptEventType );
m_MetaTable.RegisterObjectDirect( "AddScriptListener", (EventManager *)0, &EventManager::AddScriptListener );
m_MetaTable.RegisterObjectDirect( "RemoveScriptListener", (EventManager *)0, &EventManager::RemoveScriptListener );
m_MetaTable.RegisterObjectDirect( "AddScriptActorListener", (EventManager *)0, &EventManager::AddScriptActorListener );
m_MetaTable.RegisterObjectDirect( "RemoveScriptActorListener", (EventManager *)0, &EventManager::RemoveScriptActorListener );
LuaPlus::LuaObject luaStateManObj = g_pApp->m_pLuaStateManager->GetGlobalState()->BoxPointer(this);
luaStateManObj.SetMetaTable(m_MetaTable);
g_pApp->m_pLuaStateManager->GetGlobalState()->GetGlobals().SetObject("EventManager", luaStateManObj);
Сначала мы создаем метатабельный параметр, его __index, равный самому метатабельному, и связываем некоторые функции C ++ с записями в таблице. Теперь любая таблица, которая использует этот метатабль, должна «наследовать» эти функции, если я правильно понимаю.
Часть, которую я не понимаю, это последние 3 строки кода. Похоже, что мы создаем LuaObject и затем связываем его с объектом C ++ с помощью этого указателя, устанавливаем для его метатаблицы то же значение, что и выше, а затем создаем глобальную переменную Lua, чтобы к ней можно было обращаться в сценарии Lua?
Какой смысл делать это, если какая-либо таблица, которая использует вышеприведенные метатаблицы, уже имеет доступ к функциям-членам C ++?