|
|
查找了网上的许多C++邦定的库,不是太大,太复杂,就是过于简单。
tolua++ 需要2次生成代码,放弃..
luabind 需要使用boost ,过于庞大,加之本人对于boost库研究甚少,放弃..
MLuaBind 使用loki库,也过于复杂,并且还是小版本号,不敢用..
最后发现2个 easylua 和 luaplus ,但是还是有其缺点
easylua实现都是使用了luaL_ref 感觉不爽。并且无法导出多余一个参数的类成员函数
class MyClass
{
...
virtual int XX(const char * p ,const char *p2) ;
...
}
无法导出,怎么也调试不过,望各位大虾赐教 ^ ^
luaplus 是基于lua源代码更改,带来的问题是无法和官方发布的新版同步,内涵bug也就无法保证。
为了使用上的方便,不得不结合2个重写了一个简单适用的工具头文件。
文件获取连接:
http://pickup.mofile.com/1928676753022483
使用方法:
main.cpp
- #include "LuaPlusCD.h"
- class ObjectAAA
- {
- public:
- ObjectAAA(){}
- void Print2(int num,const char *pp,const char* p3)
- {
- cout<<"ObjectAAA::Print2: "<<p3<<endl;
- }
-
- static ObjectAAA* CreateInstance()
- {
- ObjectAAA* p = new ObjectAAA();
- cout<<"CreateInstance:"<<p<<"\n";
- return p;
- }
- int m_num;
- LUA_EXPOSED(ObjectAAA)
- };
- LUA_EXPOSED_CLASS(ObjectAAA)
- LUA_REGISTER_RET_PTR_CALL(ObjectAAA)
- //LUA_REGISTER_RET_PTR_CALL 是为了在类的成员函数返回这个对象的指针时,自动压入USERDATA,是一个模板的偏特化
- LUA_EXPOSED_START(ObjectAAA)
- LUA_EXPOSE( "Print2", Print2 )
- LUA_EXPOSE_STATIC("CreateInstance",CreateInstance)
- LUA_EXPOSED_END(ObjectAAA)
- int main(void)
- {
- lua_State* L;
- /* initialize Lua */
- L = lua_open();
- luaL_openlibs(L);
-
- //注册 ObjectAAA 到lua内, lua 脚本中的ObjectAAA是一个工厂,并且不能调用非static成员函数
- ObjectAAA::RegisterClass(L);
-
- int rc = luaL_loadstring(L," ha1 = ObjectAAA:CreateInstance() ha1:Print2(3,'3','3') "
- "ha2 = ha1:CreateInstance() ha2:Print2(4,'4','4')");
- if (rc) {
- cerr<<lua_tostring(L, -1)<<endl;
- lua_pop(L, 1);
- lua_close(L);
- return 0;
- }
-
- rc = lua_pcall (L, 0, 0, 0);
- if (rc)
- {
- cerr<<lua_tostring(L, -1)<<endl;
- lua_pop(L, 1);
-
- }
- lua_close(L);
- return 0;
- }
复制代码
优势:
达到简单可用,浏览一遍即可完全理解。
能够随意使用virtual函数。
限制:
类的成员函数不能使用stl作为参数和返回值。
由于是userdata所以对于不能__newindex
对于数据成员的赋值和存取没有解决,
#define LUA_EXPOSE_PROPERTY_SET( NAME, ITEM ) lpcd_pushmemberpropertysetclosure(pLua,&LOCALCLASS::ITEM, 0); lua_setfield(pLua, -2, NAME );
#define LUA_EXPOSE_PROPERTY_GET( NAME, ITEM ) lpcd_pushmemberpropertygetclosure(pLua,&LOCALCLASS::ITEM, 0); lua_setfield(pLua, -2, NAME );
无法正常工作
|
|