備忘録

プログラムやゲーム関連に関すること

【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 と表示される