5

Luabind を使用して、ゲーム エンジンを Lua に公開しています。最近、Lua で GUIObject * obj = new GUIObject() などの「新しい」オブジェクトを作成する方法がなく、代わりに Lua 内で作成されたものはすべて Lua によって所有されていることがわかったときに、問題が発生しました。

それは大きな問題ではありませんでしたが、GUIManager Has などのオブジェクトに一種の Factory パターンを作成することにしました。

class GUIManager {
template <class T> T * CreateObject( T classType )
{
    return new T();
}
}

私の Luabind バインディングは次のようになります。

class_<GUIManager>("GUIManager")
         .def("CreateObject", (GUILabel*(GUIManager::*)(GUILabel classType))&GUIManager::CreateObject<GUILabel>)
         .def("CreateObject", (GUIImage*(GUIManager::*)(GUIImage classType))&GUIManager::CreateObject<GUIImage>)

を呼び出すことにより、Luaですべてが機能します。

testLabel = theGUI:CreateObject(GUILabel())

ただし、渡すオブジェクトを本質的に作成しているため、これは「正しくない」と感じています。もっと簡単な方法があると確信していますが、これまでに試した他のすべての方法は、コンパイラまたはルビンド。

必要に応じて、さらに詳しい情報をお気軽にお尋ねください

ありがとう

4

1 に答える 1

3

Luabind バインディングはCreateObjectメソッドの明示的なインスタンス化を使用しているため、各インスタンスを異なる名前にバインドできます。

class_<GUIManager>("GUIManager")
         .def("CreateLabel", /*...*/&GUIManager::CreateObject<GUILabel>)
         .def("CreateImage", /*...*/&GUIManager::CreateObject<GUIImage>)

次に、Lua コードを次のように「単純化」できます。

testLabel = theGUI:CreateLabel()

また、ファクトリ メソッドにパラメーターはもう必要ありません。

class GUIManager {
    template <class T> T * CreateObject() { return new T(); }
};
于 2012-08-17T16:41:26.127 に答える