私はC++で次のクラスを持っています
class B;
class A {
B* GetB();
void SetB(B*& b) { _b = b;};
private:
B* _b;
}
そして lua バインディング コードの一部:
int A::setB(lua_State* L) {
A* a = checkA(L,1) // Macro for luaL_checkudata
B* b = checkB(L,2) // again similar macro
a->SetB(b);
return 0;
}
int A::getB(lua_State* L) {
A* a = checkA(L,1) // Macro for luaL_checkudata
B* b = a->GetB();
// how do i return the already created userdata for this B* instance?
// right now I am doing
B** bp = (B**)lua_newuserdata(L, sizeof(B*));
*bp = b;
luaL_getmetatable(L, "B");
lua_setmettable(L, -2);
return 1;
}
そして、これらをLuaでユーザーデータとしてラップしたいので、次のようなことができます:
local a = a.new() -- create new userdata
local b = b.new() -- create new userdata
a:SetB(b) -- associate B with A
local b2 = a:GetB() -- get the B associated with A back, and stored as b2
のアドレスを印刷するb
とb2
、2 つの固有のアドレスが得られますlua_newuserdata
。しかし、理想的には、同じメモリブロックを指しているため、同じユーザーデータを返したいと思います。どうすればこれを行うことができますか?
Lua にメモリを「担当」してもらいたいので、ガベージ コレクションで適切に削除されます。したがって、軽いユーザーデータが可能かどうかはわかりません。