0

次のようなものを作成したいと思い
ます。1。Luaでオブジェクトを作成します
。2。このオブジェクトをC++に取得します。3。このオブジェクトに対して
何らかのメソッドを実行してC++から渡します。


今、私はこれをLuaに持っています:

Account = {balance = 0}

function Account.Create(name)
    local a = Account:new(nil, name);
    return a;
end

function Account:new (o, name)
  o = o or {name=name}
  setmetatable(o, self)
  self.__index = self
  return o
end

function Account:Info ()
  return self.name;
end

C++でのコード

//get Lua object

lua_getglobal (L, "Account");
lua_pushstring(L, "Create");
lua_gettable(L, -2);
lua_pushstring(L, "SomeName");
lua_pcall(L, 1, 1, 0);
const void* pointer = lua_topointer(L, -1);
lua_pop(L, 3);

//then I want to perform some method on object

lua_getglobal (L, "Account");
lua_pushstring(L, "Info");
lua_gettable(L, -2);
lua_pushlightuserdata(L,(void*) pointer );
lua_pcall(L, 0, 1, 0);
//NOW I GET "attempt to index local 'self' (a userdata value)'
const char* str = lua_tostring(L, -1);
...etc...

私が間違えたことはありますか?このLuaオブジェクトをC++に変換するにはどうすればよいですか?

4

1 に答える 1

2
const void* pointer = lua_topointer(L, -1);

Lua テーブルは C オブジェクトではありません。彼らはそうではありませんvoid*lua_topointerドキュメントには、関数は主にデバッグ目的であると書かれています。あなたは何もデバッグしていません。

Lua テーブルには、Lua API を介してのみアクセスできます。Lua テーブルなどへのポインターを取得することはできません。代わりに、Lua テーブルをある場所に保存し、アクセスしたいときにその場所から取得する必要があります。この種のデータを格納する一般的な場所は、Lua レジストリです。Lua コードからはアクセスできません。C-API だけが通信できます。

通常、現在保持しているすべての Lua 値を含むテーブルがレジストリに格納されます。そうすれば、あなたがレジストリを使用しても、他の誰かがレジストリを使用するのを妨害することはありません。

于 2012-05-29T21:11:41.657 に答える