2017-04-07 50 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; 
}