首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法修改传递给lua的对象

无法修改传递给lua的对象
EN

Stack Overflow用户
提问于 2013-09-24 20:49:04
回答 1查看 765关注 0票数 2

考虑以下使用LuaBridge将对象传递给lua脚本的示例:

代码语言:javascript
复制
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不能修改传递的变量:

代码语言:javascript
复制
Core.t1.d = 12
print(Core.t1.d)

上面的代码打印10__。

在C++中,在处理脚本之后,变量仍然保存它的初始值。

代码语言:javascript
复制
luaL_dofile(lua_state, ".../test.lua");

std::cout << t1.d << std::endl; // 10

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-25 14:11:21

LuaBridge复制了你的论点。如果您自己定义了一个复制构造函数并在那里放置了一个断点,那么您将从

代码语言:javascript
复制
/**
  Push T via copy construction from U.
*/
template <class U>
static inline void push (lua_State* const L, U const& u)

这只是在LuaBridge中传递参数的契约。我想是这样的,因为数据具有C++管理的生存期,这是一个安全特性。你可以用一个新的值重写你的数据,你会得到你想要的:

代码语言:javascript
复制
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)

输出

代码语言:javascript
复制
10
12
12

C++端t1的d值为12。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18991758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档