Lua教程(六):绑定一个简单的C++类
本文是最后一篇C/C++与Lua交互的教程,在此之后,我们会结合Cocos2D-X来介绍Lua绑定。本文主要介绍如何绑定一个简单的C++类到Lua里面,并且提供Lua的面向对象访问方式。
绑定C++类
定义C++类
首先,我们定义一个Student类,它拥有名字(字符串类型)和年龄(整型),并且提供一些getter和setter,最后还提供了一个print方法.这里有Student类的定义和实现:Student.h和Student.cpp
编写绑定代码
首先,让我们编写在Lua里面创建Student对象的方法:
Student**s= (Student**)lua_newuserdata(L,sizeof(Student*)); //luawillmanageStudent**pointer *s=newStudent; //这里我们分配了内存,后面我们会介绍怎么让Lua在gc的时候释放这块内存
接下来是getName,setName,setAge,getAge和print方法的定义:
intl_setName(lua_State*L) { Student**s=(Student**)lua_touserdata(L,1); luaL_argcheck(L,s!=NULL,1,"invaliduserdata");
luaL_checktype(L,-1,LUA_TSTRING);
std::stringname=lua_tostring(L,-1); (*s)->setName(name); return0; }
intl_setAge(lua_State*L) { Student**s=(Student**)lua_touserdata(L,1); luaL_argcheck(L,s!=NULL,1,"invaliduserdata"); luaL_checktype(L,-1,LUA_TNUMBER); intage=lua_tonumber(L,-1); (*s)->setAge(age); return0; }
intl_getName(lua_State*L) { Student**s=(Student**)lua_touserdata(L,1); luaL_argcheck(L,s!=NULL,1,"invaliduserdata"); lua_settop(L,0); lua_pushstring(L,(*s)->getName().c_str()); return1; }
intl_getAge(lua_State*L) { Student**s=(Student**)lua_touserdata(L,1); luaL_argcheck(L,s!=NULL,1,"invaliduserdata"); lua_settop(L,0); lua_pushnumber(L,(*s)->getAge()); return1; }
intl_print(lua_State*L) { Student**s=(Student**)lua_touserdata(L,1); luaL_argcheck(L,s!=NULL,1,"invaliduserdata"); (*s)->print();
return0; }