gpt4 book ai didi

c++ - 无法修改传递给 lua 的对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:55:58 25 4
gpt4 key购买 nike

考虑以下使用 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); 显然是可以修改的
测试 *t1 = &t;
并且仍然&t1 传递给 addVariable。我真的不明白这种行为,有人可以解释一下吗? (地址的地址?)

最佳答案

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

关于c++ - 无法修改传递给 lua 的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18991758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com