2011-01-09 13 views
2

私はtolua ++を使っていくつかのC++クラスをLuaにエクスポートしています。tolua ++:LuaにエクスポートされたC++クラスにlua関数を追加

各クラスはlua側でluaテーブルとして「実装されている」と私は理解しています。したがって、C++オブジェクトテーブルに新しい(ルア)メソッドを追加して、新しいメソッドをC++クラスに追加するという効果が得られるかどうかは疑問です。

Foobarクラスをエクスポートしているとします。

Foobar:method1() 
Foobar:method2() 
... 

など

私はfoobarのテーブルに新しいメソッド(newmethod1、およびnewmethod2)を追加できるようにしたいと思い

「オブジェクトを次のように

foobarの方法

はLuaの中でaccessisbleなります「

は、私は、次の質問がある:

  1. はそれがFUNCT 'を広げる' ことは可能です上記のように、エクスポートされたC++オブジェクトのイオン性は?
  2. Foobarテーブルに新しい関数を追加するにはどうすればよいですか? (私は比較的新しいLuaです)

答えて

3

はい、既存のエクスポートされたクラスに新しいメソッドを追加することは可能です。

フーバーは単純なテーブルなので、他のテーブルと同じようにメソッドをアタッチできます。 [1]

Foobar["extra_method"] = function (self, arg1, arg2) print(arg1, arg2) end 

をし、今あなたが行うことができます。

Foobar:extra_method(1,2) 

1 2が表示されます。

[1] tolua ++はやや奇妙に動作します。クラスの静的メンバー関数(たとえば、Foobar:new()のクラスのインスタンスメンバー関数(たとえば、Foobar:method1()と思われるもの)の両方を保持する、Foobarとして表示される各クラスのメインテーブルを1つ作成します。 luaの:演算子は構文的砂糖です。 a:b()a.b(a)に変換されます。これは、Foobar:new()に電話すると、Foobar:new(Foobar)に転記されるため、self引数はFoobarテーブルになります。 Foobar型のオブジェクトを作成し、その上でmethod1()を呼び出すと、selfがそのオブジェクトになります。したがって、新しいメソッドmethod3をFoobarテーブルに追加すると、Foobar:method3()obj = Foobar:new(); obj:method3()が実行されますが、前者はエラーになります。したがって、この回答はtolua ++でしか動作しません。

編集:コメント

私はここに実際のコードを使用してみましょうに対処します。それでは、私たちがどのように見えるFOOBARのクラス宣言を持っていると仮定してみましょう:

class Foobar { 
    public: 
    void method1(); 
    static void method2(); 
}; 

tolua ++はこのクラスのLUAバインディングコードを生成するとき、(次の方法

  • 新しいとあなたのテーブルを与えるために起こっています) - Foobar:new()と呼んで、Foobarのインスタンスを作成します。
  • delete() - instance:delete()として呼び出し、Foobarのインスタンスを破棄します。
  • method1() - instance:method1()と呼び、instance1でmethod1を実行します。
  • method2() - 方法2を実行するにはFoobar:method2()と呼び出します。

しかし、tolua ++は実際には2つの異なるテーブルを使用しません(クラス自体に接続するメソッドとそのクラスのインスタンスのメソッドに1つずつ)。代わりに、2つのファイルをマージするので、メソッドの使用方法ではありませんが、Foobar:method1()instance:new()を実行することは可能です。したがって、静的メソッドの使用方法とインスタンスメソッドの使用方法には違いはありません。構文的にも同じです。 (私は個人的にこれは++ toluaに問題があると感じる)

あなたが例を探しているなら、ここにあなたがLUA内からこれらの関数を呼び出すする方法である。説明のため

obj = Foobar:new() 
print(obj:method1()) 
obj:delete() 
+0

感謝。静的メソッドの呼び出し方法とインスタンスの呼び出し方法の違いはまだ分かりません。私は、Foobarという名前のクラスでメソッドの呼び出しを推測しています:Foobar:static_method()とfoobarvar:instance_method()? – skyeagle

+0

既存のC++メソッドも上書きできますか? C++メソッドをREADONLYにする方法はありますか(つまり、C++メソッドが代入によって上書きされないようにする) – skyeagle

+0

はい、既存のC++メソッドを同じ方法で上書きできます。既存のメソッドの名前を使用します。 読み取り専用テーブルを作成することは簡単ではなく、完全ではありません。こちらをご覧ください:http://lua-users.org/wiki/ReadOnlyTables –

関連する問題