Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何导出C++;指向lua的指针? < C++中,我有两个类 class A { void a_func(); } class B { A* _a; A* GetA(){return _a;} }_C++_Lua - Fatal编程技术网

如何导出C++;指向lua的指针? < C++中,我有两个类 class A { void a_func(); } class B { A* _a; A* GetA(){return _a;} }

如何导出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将非常适合我 (更新) 这可能是一个

然后,假设我有一个userdata对象B,B

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;
}