Lua C++ userdata:用户数据类型,可以由C++代码创建并绑定到Lua变量中。它的值可以是任何C++对象或结构体的指针,允许Lua脚本与C++代码之间交换数据和调用C++接口。
2015-6-21 7:27:10
收藏:0
阅读:83
评论:2
我正在尝试访问userdata的类型,以便我可以相应地处理它。假设我有一个名为Foo的类:
class Foo : public CObject
{
public:
Foo() : CObject() {}
int type() { return 1; }
}
class CObject
{
public:
virtual int type(void) = 0;
}
原理是,每个扩展CObject的类都有一个类型,必须通过整数号(稍后为枚举)来确定。使用luaWwrapper将Foo类绑定到lua(//https://bitbucket.org/alexames/luawrapper/src/fd9c4fdbf4b25034e3b8475a2c8da66b7caab427?at=default )。
Foo * foo_new(lua_State * L)
{
Foo * f = new Foo();
lua_newuserdata(L, sizeof(f));
std :: cout << "f =" << f;
返回f;
}
在Lua中,用户将其调用为:
f = Foo.new()
print(f)
现在我有一个C ++函数,比如print:
int lua_print(lua_State * L)
{
void * ud = luaL_checkudata(L,1,“Foo”); //ud不为零
std :: cout <<“ud =”<< ud;
CObject * obj =(CObject *)ud; //转换为CObject
int objtype = obj->type(); //程序在此处崩溃
}
我发现程序崩溃是因为“Foo”和“ud”的内存地址不同。我_认为_“ud”是指堆栈内存,其中包含“Foo”的内存地址。如何访问堆栈的内存地址或“Foo”的首选内存地址?
点赞
用户63791
Foo_new 应该只返回对象的指针。
换句话说,你的 Foo_new 应该像这样:
Foo* Foo_new(lua_State* L)
{
return new Foo();
}
然而,如果你没有需要特殊初始化的操作,你甚至不需要编写这个函数。如果你没有自己编写函数,神奇的模板会自动为你提供这个函数。
当你想从 Lua 状态获取你的 Foo 对象时,你可以这样做:
int lua_print(lua_State* L)
{
Foo *ud = luaW_to<Foo>(L, 1); //ud is not zero
std::cout<<"ud="<<ud;
CObject* obj=(CObject*)ud;
int objtype=obj->type();
}
如果 CObject 也已经与 LuaWrapper 注册了,你甚至不需要手动转换类型。你只需这样做:luaW_to<CObject>(L, 1);。
2015-07-09 23:20:13
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
你需要使用定位 new 来初始化对象 _在
lua_newuserdata返回的内存中_。大致如下:
void *ud = lua_newuserdata(L,sizeof(Foo)); new (ud) Foo();