【Lua】LuaでC++のクラスを表現する
基本的なLuaライブラリは過去記事を参照。
参考:その4 会得必須!Luaの真髄「テーブル」
test.cpp
#include <iostream> #include <lua.hpp> void test() { auto L = luaL_newstate(); luaL_openlibs(L); if (luaL_dofile(L, "test.lua")) { std::cout << lua_tostring(L, lua_gettop(L)); lua_close(L); return; } lua_close(L); } int main(int argc, char* argv[]) { test(); getchar(); // 入力待ち用 return 0; }
data.lua
-- テーブルを返却するテーブル(型)を定義する -- C++環境でのファクトリーを持つクラスを意識すると解りやすい Data = { -- テーブルを返却する無名関数を持たせる Create = function() return { -- メンバ変数を定義する member1 = 0, member2 = "test", -- メンバ関数を定義する -- メンバ関数内でメンバ変数を使用するには -- 自身が必要なので引数にthisを持たせる print = function(this) print(this.member1, this.member2) end, set = function(this, m1, m2) this.member1 = m1 this.member2 = m2 end } end }
test.lua
-- C環境の#includeと同じ解釈 -- 読み込むLuaファイルを拡張子なしで呼び出す require("data") -- データテーブルからオブジェクトを生成する obj = Data.Create() -- メンバ関数であるprintに毎回自身を渡すのは冗長なので -- : を使用することによって第1引数に自身を渡すことができる obj.print(obj) -- 0 test と表示される obj:print() -- 0 test と表示される -- メンバ変数を書き換えて表示させる obj.member1 = "hello" obj.member2 = "world" obj:print() -- hello world と表示される -- メンバ関数からメンバ変数を書き換えて表示する obj:set("get", "ready") obj:print() -- get ready と表示される