LuaPlus中的C ++对象

时间:2011-09-03 20:07:43

标签: c++ lua

我有一个关于使用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);

首先,我们创建一个metatable设置,使其__index等于metatable本身,并将一些C ++函数与表中的条目相关联。现在任何使用这个元表的表都应该“继承”这些函数,如果我正确理解这一点。

我不理解的部分是最后3行代码。看起来我们创建了一个LuaObject,然后使用这个指针将它与C ++对象关联,将其metatable设置为与上面相同,然后创建一个全局Lua变量,以便可以在Lua脚本中访问它?

如果使用上述元表的任何表已经可以访问C ++成员函数,那么这样做有什么意义?

1 个答案:

答案 0 :(得分:1)

我不确定是什么让你感到困惑,但是我对每一行都有所了解

LuaPlus::LuaObject luaStateManObj = g_pApp->m_pLuaStateManager->GetGlobalState()->BoxPointer(this);

这一行创建了一个包装c ++指针的lua对象。这个对象存在于lua中,但就运行时而言,它是一个无名对象,因此你无法从lua端访问它。

luaStateManObj.SetMetaTable(m_MetaTable);

非常不言自明,只需将之前创建的元表设置为刚刚创建的对象。

g_pApp->m_pLuaStateManager->GetGlobalState()->GetGlobals().SetObject("EventManager", luaStateManObj);

在这里,您将为您创建一个“lua名称”的lua对象,以便您可以从脚本端访问它。在此行之后,如果执行一个调用名为“EventManager”的对象的lua脚本,它将引用您在此处指定的对象。在此行之前,lua中没有绑定到“EventManager”名称的对象(假设之前没有人定义过它)。