LuaPlus 中的 C++ 对象

我对使用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++函数与表中的条目关联起来。现在,如果我理解正确的话,使用这个metatable的任何表格都应该“继承”这些函数。

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

如果使用上述metatable的任何表格已经可以访问C++成员函数,那么这样做的目的是什么呢?

原文链接 https://stackoverflow.com/questions/7295579

点赞
stackoverflow用户1041935
stackoverflow用户1041935
我不确定哪一部分让你感到困惑,但以下是我对每行代码的理解:

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


这行代码创建了一个 Lua 对象,用于包装 C++ 指针。这个对象在 Lua 中存在,但是在运行时中,它是一个无名的对象,因此你无法从 Lua 端访问它。

luaStateManObj.SetMetaTable(m_MetaTable);


这行非常简单,只是将之前创建的元表设置给刚刚创建的对象。

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

```

这行代码是给刚刚创建的 Lua 对象起了一个"Lua 名称",以便你可以从脚本方面访问它。在此代码行中,如果你执行了一个名为"EventManager"的对象的 Lua 脚本,它将引用你在此处分配的对象。在此行之前,没有对象与"EventManager"名称绑定(假设之前没有人定义过)。

2012-08-17 18:52:16