2017-04-07 9 views
0

は、私は2つのクラスC++ポインタをルアにエクスポートするにはどうしたらいいですか? C++で

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は個別のメタデータを持っていません。したがって、ポインタを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

軽いユーザーデータではない重いユーザーデータが必要です。 – lhf

+0

@francis lua_pushuserdataではなくlua_newuserdata()です。 – Vlad

+0

私はlua_newuserdata()を知っていましたが、新しいデータを作成しようとしています。なぜなら、私はこの関数の前にAインスタンスを作成しているからです。私はここでゲッターが必要です。 @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; 
} 
関連する問題