//
// luabind class와 C++ class와의 맴버 함수/변수의 상호 참조/호출 테스트
//
// example by redpixel
//
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
};
#include <iostream>
#include <stdlib.h>
#include <luabind/luabind.hpp>
#include <luabind/class.hpp>
using namespace std;
struct parent_class {
int v_;
int get_v() const { return v_; }
void set_v(int v) { v_ = v; }
void func1() { cout << "C++ - parent_class::func1()" << endl; }
void func0() { cout << "C++ - parent_class::func0()" << endl; }
parent_class() { v_ = 10; }
};
char test_src[] =
"class 'child_class'(parent_class);"
"function child_class:__init() super() end;"
"function child_class:func1() print('lua - child_class::func1()') end;"
"function child_class:func2(v_) print('lua - child_class::func2() - '..v_) end;"
"ttt = child_class();"
"print('- lua 호출 테스트 -----------------------------');"
"print(ttt.v);"
"ttt:func0();"
"ttt:func1();"
"ttt:func2('루아');"
"print('- C++ 호출 테스트 -----------------------------');"
"class_test(ttt);";
void class_test(luabind::object o_) {
luabind::object fo0_ = o_["v"]; cout << luabind::object_cast<long>(fo0_) << endl;
luabind::object fo1_ = o_["func0"]; fo1_(o_);
luabind::object fo2_ = o_["func1"]; fo2_(o_);
luabind::object fo3_ = o_["func2"]; fo3_(o_, "C++");
}
int main(int argc, char *argv[])
{
lua_State *L = lua_open();
luaopen_base(L); // 기본 라이브러리
luabind::open(L); // luabind 초기화
using namespace luabind;
// 루아에 C++ 클래스 등록
module(L)
[
class_<parent_class>("parent_class")
.def(constructor<>())
.def("func0", &parent_class::func0)
.def("func1", &parent_class::func1)
.property("v", &parent_class::get_v, &parent_class::set_v)
,
def("class_test", &class_test)
];
// 루아 테스트 스크립트 실행
lua_dostring(L, test_src);
system("PAUSE");
return 0;
}