如何导出C++;指向lua的指针? < C++中,我有两个类 class A { void a_func(); } class B { A* _a; A* GetA(){return _a;} }
然后,假设我有一个userdata对象B,B如何导出C++;指向lua的指针? < C++中,我有两个类 class A { void a_func(); } class B { A* _a; A* GetA(){return _a;} },c++,lua,C++,Lua,然后,假设我有一个userdata对象B,B a = b:GetA(); a:a_func(); 问题是,如何实现B::GetA 也许你们会让我使用lightuserdata。但是,据我所知,lightuserdata没有单独的元表。因此,即使我将指针作为lightuserdata推送,我仍然不能像上面那样使用_func()。由于我不是在这里创建a,所以lua_newuserdata也不能被使用 在我的例子中,我认为不存在的lua_pushuserdata将非常适合我 (更新) 这可能是一个
a = b:GetA();
a:a_func();
问题是,如何实现B::GetA
也许你们会让我使用lightuserdata。但是,据我所知,lightuserdata没有单独的元表。因此,即使我将指针作为lightuserdata推送,我仍然不能像上面那样使用_func()。由于我不是在这里创建a,所以lua_newuserdata也不能被使用
在我的例子中,我认为不存在的lua_pushuserdata将非常适合我
(更新)
这可能是一个解决方案吗?您需要的是重用户数据而不是轻用户数据。@francis这是lua_newuserdata(),不是lua_PushUserData我知道lua_newuserdata(),但它将创建新数据,这不是我想要的。因为,我在这个函数之前创建了一个实例。我这里只需要一个Getter@Vladho我如何准确地使用重用户数据@lhf@francis,创建新的用户数据正是您所需要的。在userdata内部,您存储指向本机结构的指针,并且可以分配metatable,metatable将存储要在该指针上调用的函数。Lua端语法将完全符合您的要求。
int B::GetA_lua(lua_State* L)
{
void* p = lua_newuserdata(L, sizeof(POINTER));
memcpy(p, &_a, sizeof(POINTER);
lua_getmetatable();
lua_setmetatable();
return 1;
}
int A::a_func_lua(lua_State* L)
{
void* p = lua_touserdata();
(A*)(*p)->*a_func_pointer();
return 0;
}
int B::GetA_lua(lua_State* L)
{
void* p = lua_newuserdata(L, sizeof(POINTER));
memcpy(p, &_a, sizeof(POINTER);
lua_getmetatable();
lua_setmetatable();
return 1;
}
int A::a_func_lua(lua_State* L)
{
void* p = lua_touserdata();
(A*)(*p)->*a_func_pointer();
return 0;
}