2

C++とLuaのバインドで問題が発生しました。Luaにシンプルなクラスシステムを実装しました。これにより、別のluaファイルからluaクラスの「インスタンス」を作成できます。

require 'classname'
m_newObj = classname() --"classname() creates a new instance

次に、m_newObjの関数にアクセスできます。

m_newObj:functionname(parameter)

これは完全に正常に機能しますが、C++コードからluaクラスのインスタンスにアクセスできるようにしたいと思います。

通常、C++でlua関数へのアクセスを作成するには

lua_State* pL = luaL_newState();
...
lua_getglobal(pL, "functionName");
lua_call(pL,0,0);

ただし、これはluafile内の関数を呼び出すだけであり、「クラス」の特定のインスタンスでその特定の関数を呼び出すことはありません。

だから基本的に私がやりたいのは

  • C++でluaクラスのインスタンスにアクセスする
  • 特定のインスタンスで関数を呼び出す

これを実行したい理由は、パフォーマンスでは、C++でlua関数を使用するよりもluaでC++関数を使用する方がはるかに多くのことが必要であるため、luaコードがなくてもluaを使用してエンティティを拡張できるようにするためです。多くのC++関数を呼び出すluaのC++クラスにアクセスする代わりに、C++のluaクラスにアクセスする必要があります。

4

2 に答える 2

2
m_newObj:functionname(parameter)

これはこのための構文糖衣です

m_newObj.functionname(m_newObj, parameter)

したがって、C++コードからの同等の処理を実行してください。

于 2013-01-17T17:56:47.310 に答える
2

クラスをスタックにプッシュし、そこから関数をプッシュしてlua_getfield()から、関数を呼び出す前にクラスをスタックの一番上にコピーして戻します。このようなもの:

int nresults = 1;                  // number of results from your Lua function

lua_getglobal(L, "classname");
lua_getfield(L, -1, "funcname");
lua_pushvalue(L, -2);              // push a copy of the class to the top of the stack
lua_call(L, 1, nresults);          // equivalent to classname.funcname(classname)
于 2013-01-17T19:29:05.600 に答える