U E D R S I H C RSS
ID
Password
Join
음란한 책일수록 더 잘 쓰여져야 그 책을 보는 대중들이 더 훌륭해진다. 독은 입에 달지만 사람을 함정에 빠뜨린다. -래드클리프 홀

가끔 C++ 클래스상의 다수의 데이타들을 하나의 속성에 묶어 반환하고 싶을 때가 있습니다. 이때 개인적으로 다음과 같은 방법을 사용합니다.
  1. luabind::object를 반환값으로 하는 get 메소드를 하나 만들어 그 안에서 luabind::newtable() 함수를 사용하여 원하는 데이타를 담아 반환하도록 작성한다.
  2. 이 get 메소드를 readonly property로서 등록한다.

C++ 예제는 다음과 같습니다. (헤더화일 선언은 생략했습니다)
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;

lua_State *L = NULL;

struct test_class 
{
	luabind::object get_ttt() const { 
 		using namespace luabind;
 		object o_ = newtable(L);
 		o_["t1"] = 10;
 		o_["t2"] = 20;
 		o_["t3"] = 30;
 		return o_;
	}
};

...

module(L)
[
  class_<test_class>("test_class")
    .def("func1", &test_class::func1)
    .property("ttt", &test_class::get_ttt)
  ,
  def("init", &Linit),
  def("test_func", &test_func)
];
루아코드는 다음과 같습니다.
Obj = test_class()
print(Obj.ttt.t1)
print(Obj.ttt['t2'])
실행결과는 다음과 같을겁니다.
10
20
위에서 보면 쉽게 알수 있듯이, 충분히 기존 C++ 클래스에서 사용가능한 방법입니다. 이 방법은 다음과 같은 장단점을 가지고 있습니다.
  1. 장점
    • 이미 작성된 C++ 클래스에 쉽게 기능을 추가할 수 있다.
    • 가변적이고 임의의 자료집합을 표현할 수 있다. (예 : 방금 전달된 네트워크 패킷의 데이타 내용)
  2. 단점
    • 스크립트상에서는 티가 나지않지만 몰래 매번 참조할 때마다 새로 테이블을 생성한다. (이에 따른 성능상의 과부화 증가) 하지만 게임엔진상에서 매 루프마다 gc를 실행하는 구조에서는 그다지 부하가 없다

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-10-28 12:42:52
Processing time 0.0513 sec