2017-04-07 92 views
0

在C++中,我有两个类如何将C++指针导出到lua?

class A 
{ 
void a_func(); 
} 

class B 
{ 
A* _a; 
A* GetA(){return _a;} 
} 

然后,假设我有B的用户数据对象,B。

a = b:GetA(); 
a:a_func(); 

问题是,我该如何实现B :: GetA?

也许,你们会让我使用lightuserdata。但是,据我所知,lightuserdata没有单独的metatable。所以,即使我将指针作为lightuserdata来推,我仍然不能像上面那样使用a_func()。由于我在这里不创建A,所以lua_newuserdata也不能使用。我认为lua_pushuserdata不存在将适合我。


(UPDATE)

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

这是一个可能的解决方案?

+1

您需要沉重的userdata而不是light userdata。 – lhf

+0

@francis它是lua_newuserdata(),而不是lua_pushuserdata – Vlad

+0

我知道lua_newuserdata(),但它会创建新的数据,这不是我想要的。因为,我已经在此函数之前创建了A实例。我只需要一个Getter在这里。 @Vlad – francis

回答

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