2

考虑以下使用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

但是,可以修改不是对象成员的简单标量数据类型(如浮点数) 。我错过了什么吗?


编辑:Test t1(10);如果我替换为Test *t1 = new Test(10);或什Test t(10); Test *t1 = &t;至并且仍然传递&t1给 addVariable ,它显然是可修改的。我不太了解这种行为,有人可以解释一下吗?(地址的地址?)

4

1 回答 1

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++ - side t1 的 d 值为 12

于 2013-09-25T14:11:21.417 回答