这篇文章主要介绍了Lua教程(六):绑定一个简单的C++类,本文是最后一篇C/C++与Lua交互的教程,其他教程请参阅本文下方的相关文章,需要的朋友可以参考下
本文是最后一篇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*)); // lua will manage Student** pointer
*s = new Student; //这里我们分配了内存,后面我们会介绍怎么让Lua在gc的时候释放这块内存
接下来是getName,setName,setAge,getAge和print方法的定义:
int l_setName(lua_State* L)
{
Student **s = (Student**)lua_touserdata(L, 1);
luaL_argcheck(L, s != NULL, 1, "invalid user data");
luaL_checktype(L, -1, LUA_TSTRING);
std::string name = lua_tostring(L, -1);
(*s)->setName(name);
return 0;
}
int l_setAge(lua_State* L)
{
Student **s = (Student**)lua_touserdata(L,1);
luaL_argcheck(L, s != NULL, 1, "invalid user data");
luaL_checktype(L, -1, LUA_TNUMBER);
int age = lua_tonumber(L, -1);
(*s)->setAge(age);
return 0;
}
int l_getName(lua_State* L)
{
Student **s = (Student**)lua_touserdata(L,1);
luaL_argcheck(L, s != NULL, 1, "invalid user data");
lua_settop(L, 0);
lua_pushstring(L, (*s)->getName().c_str());
return 1;
}
int l_getAge(lua_State* L)
{
Student **s = (Student**)lua_touserdata(L,1);
luaL_argcheck(L, s != NULL, 1, "invalid user data");
lua_settop(L, 0);
lua_pushnumber(L, (*s)->getAge());
return 1;
}
int l_print(lua_State* L)
{
Student **s = (Student**)lua_touserdata(L,1);
luaL_argcheck(L, s != NULL, 1, "invalid user data");
(*s)->print();
return 0;
}
以上就是Lua教程(六):绑定一个简单的C++类的详细内容,更多请关注0133技术站其它相关文章!