考虑以下使用LuaBridge将对象传递给lua脚本的示例:
class Test {
public:
double d;
Test(double t): d(t) {};
};
Test t1(10);
auto lua_state = luaL_newstate();
luaL_openlibs(lua_state);
luabridge::getGlobalNamespace(lua_state)
.beginNamespace("Core")
.beginClass<Test>("Test")
.addConstructor<void(*)(double)>()
.addData("d", &Test::d)
.endClass()
.addVariable("t1", &t1)
.endNamespace()
;
显然传递的变量不能被lua修改:
Core.t1.d = 12
print(Core.t1.d)
以上代码打印10
。
在处理脚本后,在C ++中,变量仍然保持其初始值。
luaL_dofile(lua_state, ".../test.lua");
std::cout << t1.d << std::endl; // 10
然而,可以修改非对象成员的简单标量数据类型(如float)。我错过了什么吗?
修改
如果我将Test t1(10);
替换为Test *t1 = new Test(10);
甚至Test t(10);
Test *t1 = &t;
并且仍然将&t1
传递给addVariable,则显然可以修改。我真的不明白那种行为,有人可以解释一下吗? (地址?)
答案 0 :(得分:0)
LuaBridge复制了你的论点。如果您自己定义一个复制构造函数并在那里放置一个断点,那么您将从
跳转/**
Push T via copy construction from U.
*/
template <class U>
static inline void push (lua_State* const L, U const& u)
这只是在LuaBridge中传递参数的合约。我想,就是这样,因为数据具有C ++管理生命周期,这是一个安全功能。您可以使用新值重写您的数据,并且您将得到您想要的内容:
Core.t1.d = 12
t2 = Core.Test(10)
t2.d=12
print(Core.t1.d)
print(t2.d)
Core.t1 = t2
print(Core.t1.d)
输出
10
12
12
和你的C ++ - 方t1的d值为12