質問

C ++クラスのLuaバインディングを作成する場合、テーブルまたはuserdataオブジェクトを返す必要がありますか?

各メソッドの長所と短所を知っている人はいますか?

役に立ちましたか?

解決

ユーザーデータを返すことをお勧めします。アプローチに関係なく、ポインタを置く場所が必要です C ++データ、または実際のC ++データ自体に、どこにもありません これをテーブルで安全に行うことができます。

テーブルを返すことは、いくつかの状況で意味があります。 Luaで追加の属性を使用して「注釈」を付ける これをサポートするための特別なもの。残念ながら、C ++オブジェクトポインター どこかに行かなければならず、他に行くのに賢明な場所はありません テーブル自体の実際のエントリよりも。

ここは安全な場所ではありません。 Luaで見つけることができます コード、および削除または置換。これは偶然かもしれません 目的、それは本当に重要ではありません。

したがって、私の好みはユーザーデータオブジェクトを返すことです。彼らはすることができます 本当にそれを主張しなければならない場合、テーブルのように動作するようにしましたが、 「秘密」もありますC ++の領域(実際のユーザーデータ自体) Luaコードによる上書きから安全にオブジェクトポインターを保存できます。

(Userdataオブジェクトには、別の" environment"ポインターもあります オブジェクト固有のデータを保存する場所。ユーザーデータのペイロードと同様 それ自体、この値はLuaコードからアクセスできず、破損することはありません そのように。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top