让 lua 调用 C++ 中的 member functions
2009-10-21 12:41
351 查看
最近学习了一下 lua 的内容,觉得很是不错。为了使 C++ 和 Lua 之间能够互相访问,可以使用的库是比较多的,但多数比较麻烦。
见过一个 project 使用的是 luabind,之前还一直不明白怎么看不明白程序的结构。
为了能够用 lua 调用 C++ 中的函数,就必须用 lua 的库函数进行注册,最简单直接的就是用 lua_register。
注册之后,需要维护一系列的函数组成的表。这里可以使用 lua 提供的表功能进行维护,那就需要注册很多的函数。
也可以用 C++ 中维护类似的表,这用就只需要注册一个 lua 的函数,提供多个入口。
对于写惯了 C++ 代码的人来说,后一种比较自如一些。
要调用非静态的类成员函数,如何把 C++ 的对象指针传递给 lua 呢?这是一个严重的问题。
目前,还没有找到比较合适的解决方案。
现在的做法是在 C++ 中传递指针,回避 lua 和 C++ 传递指针的问题。
===================================
传递指针和维护调用函数表是必须的,但是可以借助 C++ Template,使 Client 部分代码尽量简洁明了。
主要是用 Functor 功能,再把函数和类函数成员整合到一起。
这样处理后的代码:
//----------------------------------------------------------------------------------------
USui * p = USui::instance();
p->insert("ShowTestButton", makeFunctor(*this, &UMyWindow::showTestButton));
p->doFile("cfg.lua");
//----------------------------------------------------------------------------------------
lua 代码如下:
----------------------------------------------------------------------------------------
-- hide the test button
USui_Event("ShowTestButton", true)
----------------------------------------------------------------------------------------
此外,luaplus 提供了完整的解决方案,可以研究一下:
http://wwhiz.com/LuaPlus/LuaPlusCallDispatcher.html
见过一个 project 使用的是 luabind,之前还一直不明白怎么看不明白程序的结构。
为了能够用 lua 调用 C++ 中的函数,就必须用 lua 的库函数进行注册,最简单直接的就是用 lua_register。
注册之后,需要维护一系列的函数组成的表。这里可以使用 lua 提供的表功能进行维护,那就需要注册很多的函数。
也可以用 C++ 中维护类似的表,这用就只需要注册一个 lua 的函数,提供多个入口。
对于写惯了 C++ 代码的人来说,后一种比较自如一些。
要调用非静态的类成员函数,如何把 C++ 的对象指针传递给 lua 呢?这是一个严重的问题。
目前,还没有找到比较合适的解决方案。
现在的做法是在 C++ 中传递指针,回避 lua 和 C++ 传递指针的问题。
===================================
传递指针和维护调用函数表是必须的,但是可以借助 C++ Template,使 Client 部分代码尽量简洁明了。
主要是用 Functor 功能,再把函数和类函数成员整合到一起。
这样处理后的代码:
//----------------------------------------------------------------------------------------
USui * p = USui::instance();
p->insert("ShowTestButton", makeFunctor(*this, &UMyWindow::showTestButton));
p->doFile("cfg.lua");
//----------------------------------------------------------------------------------------
lua 代码如下:
----------------------------------------------------------------------------------------
-- hide the test button
USui_Event("ShowTestButton", true)
----------------------------------------------------------------------------------------
此外,luaplus 提供了完整的解决方案,可以研究一下:
http://wwhiz.com/LuaPlus/LuaPlusCallDispatcher.html
相关文章推荐
- C++调用lua
- cocos2d-x lua 和c++的相互调用的原理
- lua进阶5--C++调用lua函数
- C++ 调用Lua简单例子
- c/c++调用lua函数
- C++调用Lua,初探
- C/C++调用lua脚本函数
- C++ 中调用 Lua 函数
- cocos2d-x bindings-generator(lua调用c++)
- C/C++调用Lua的table
- Cocos2dx -- 入门之c++ 调用lua
- VC++6.0配置LUA环境和C++调用LUA的简单示例
- Lua学习笔记6:C++和Lua的相互调用
- Lua调用只有头文件的C++动态库函数
- Lua调用C++带参数的方法
- 在Lua中调用c++函数示例
- c、c++调用lua
- [寒江孤叶丶的Cocos2d-x之旅_25]Cocos2d-x 浅谈Lua与C++函数间互相调用问题
- VS2012下面c++调用lua库,c++编译lua方法。
- Lua与C++交互初探之Lua调用C++