U E D R S I H C RSS
ID
Password
Join
창조적인 소수가 이끌어 주지 않을 경우, 민주주의는 존속할 수 없다. ―H.F.S.

다음과 같은 루아 함수가 있다고 가정합니다.
function my_lua_function(obj)
  -- C++ 객체상의 메소드를 호출합니다.
  obj:test_method()
end

다음은 C++ 소스입니다.
struct A
{
  A() { std::cout << "A()\n"; }
  ~A() { std::cout << "~A()\n"; }
  void test_method() const { std::cout << "test\n"; }
};
 
int main()
{
  using namespace luabind;
 
  lua_State* L = lua_open();
  luabind::open(L);
 
  module(L)
  [
    class_<A>("A")
      .def(constructor<>())
      .def("test_method", &A::test_method)
  ];
 
  // 함수를 정의하기위한 루아코드를 생성하는 등등의 작업을 진행합니다.
 
  // 루아 state가 아직 존재하더라도 객체(object)와 functor가 소멸해야하기 때문에 
  // 블럭으로 묶어주었습니다.
  {
    // 루아 함수를 참조하기위해 my_lua_function object를 초기화합니다.
    object fun = get_globals(L)["my_lua_function"];
    luabind::functor<void> my_lua_function = object_cast<functor<void> >(fun);
 
    // adopt(_1)은 포인터의 소유권이 루아로 이전될 것이라는 것을 의미합니다. 
    // 좀더 구체적으로 말하자면 포인터가 개비지 컬랙트당하면 메모리 해제됩니다. (이부분이 핵심!)
    my_lua_function(new A())[adopt(_1)];
  }

  lua_close(L);
  return 0;
}
간단히 말하면 adopt() 정책을 사용하면 된다는 의미. :)

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