也許我壞在谷歌搜索,也許我嘗試過想事情,但如果我有這樣的Lua類:創建和Lua中訪問的Lua對象,存儲在C++程序
--Foo:
Foo = {number = 0}
function Foo.setNumber(newNumber)
number = newNumber
end
如果我試圖在另一個.lua文件中使用這個類,在文件結束後,對象被銷燬。我見過的使用Lua的其他教程(like here)假設C++程序已經知道類,所以它被定義爲正常的C++類。然而就我而言,Lua的重點在於,C++程序只是一個處理繪圖等的框架,因此不能將Lua類硬編碼到程序中。
所以,我的問題是,我如何定義和保留一個Lua對象,使用Lua,但是除非我明確告訴它,否則該對象不會被銷燬?我正在考慮在C++中創建一個存儲Lua對象的向量/地圖的類,然後Lua腳本可以使用暴露的函數請求一個對象。不幸的是,這聽起來很慢,因爲Lua要執行一個函數,它需要從C++接收類的副本,調用該類的函數,然後將其發送回C++以覆蓋前一個副本。
下面是一些代碼是從EliasDaler's教程修改於我如何運行的Lua腳本(這是非常好的IMO):
#include <lua.hpp>
#include <LuaBridge.h>
#include <string>
//Example class to expose (I realise it's very similar to Foo):
class Bar
{
private:
std::string string;
public:
void setString(const std::string& newString) {string = newString;}
}
int main()
{
//Expose the API:
lua_State* L = luaL_newstate();
luaL_openlibs(L);
luabridge::getGlobalNamespace(L)
.beginClass<Bar>("Bar")
.addConstructor<void(*)(void)>()
.addFunction("setString", &Foo::setString)
.endClass();
//Run the script:
luaL_dofile(L, "script.lua");
luaL_openlibs(L);
lua_pcall(L, 0, 0, 0);
return 0;
}
我認爲這取決於你如何從C++調用lua腳本。 – stgatilov
@stgatilov你是什麼意思?像我正在使用的庫? – bboy3577
如果你從控制檯運行「lua a.lua」和「lua b.lua」,那麼它們肯定不會共享全局變量。我假設你從C++代碼調用LUA腳本。然後有必要確保這兩個腳本都使用相同的LUA狀態。這就是爲什麼我要求你提供更多關於你如何運行LUA腳本的細節。 – stgatilov