打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C++ 对象的Lua脚本化 第2页

C++ 对象的Lua脚本化

[日期:2013-03-05] 来源:Linux社区  作者:leonwei [字体: ]

C++ 对象的Lua脚本化

假设有一个类MyCClass 我在C++层实现了它的一些方法,如SetI(int)、 GetI()等,我想将这个类脚本化给Lua层能面向对象的访问。

下面写下我的一些简要实现

--New :

在C++中定义函数int MyCClass::NewMyCClass( lua_State* L ) ,这个函数在lua中可以使用c=NewMyCClass()来生成一个MyCClass的对象

NewMyCClass 具体实现是:

int MyCClass::NewMyCClass( lua_State* L )
{

//创建usrdata实例并传到栈中
size_t bytes=sizeof(MyCClass);
MyCClass* c=(MyCClass*)lua_newuserdata(L,bytes);


//为usrdata创建元表以实现面向对象的方法,这里给c这个对象加入一个元表,原表中对GetI这个index赋予MyCClass::GetI这个函数
int r=luaL_newmetatable(L,"MyCClassMeta");
lua_pushvalue(L,-1);//copy --index table
lua_pushcfunction(L,MyCClass::GetI);
lua_setfield(L,-2,"GetI");//reg func
lua_setfield(L,-2,"__index");//set __index table

lua_setmetatable(L,-2);//-2?

return 1;
}

当然在程序开始处要注册这个NewMyCClass

lua_register(L,"NewMyCClass",MyCClass::NewMyCClass);

--成员函数GetI:可以在lua层 c:GetI()

int MyCClass::GetI( lua_State* L )
{
MyCClass* c=(MyCClass*)lua_touserdata(L,1);

int r=c->GetI()
lua_pushinteger(L,r);
return 1;
}

 

--成员函数SetI 可以在lua层 c:SetI(100)

int MyCClass::SetI( lua_State* L )
{
MyCClass* c=(MyCClass*)(lua_touserdata(L,1));
int p1=luaL_checkint(L,2);

int r=c->SetI(p1)
return 0;

}

这样一个非常简单的在lua层面向对象的访问C++的实现就好了。

优化

1.完整的版本在元表的赋值中可能还有加入MyCClass::Del以实现c:Del()来删除 但是有些架构所有的析构操作可能都在引擎层完成,并不暴露给脚本层,(甚至new操作也是)

2.上面的代码对于在c++中写的每个类都要相应的写出来一遍这些函数,如对于MyCClass::SetI(int i)你就要写一个供lua调用版本的static int MyCClass::SetI( lua_State* L ),因为给lua调用函数永远是这种类型,且需要是全局的。在实际框架的搭建中,我们通常采用宏函数的方法,如定义一个宏 REG_CLASS_FUNC(class,class_func)来按一定规则自动产生这个lua调用版的函数。相应的也可以通过定义一个宏函数REG_CLASS来自动注册一个类的lua_register(L,"NewMyCClass",MyCClass::NewMyCClass)给lua

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
c++调用lua脚本1(平台windows)
luajit FFI LUA脚本中怎样调用C自己定义的函数
把Lua移植到stm32上,效果不错! (amoBBS 阿莫电子论坛)
TCC(Tiny C Compiler)用C语言当脚本例子
[LUA学习笔记02]在C中通过LUA API访问LUA脚本变量(转)
轻量级语言Lua入门
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服