专职C++

不能停止的脚步

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  163 Posts :: 7 Stories :: 135 Comments :: 0 Trackbacks

常用链接

留言簿(28)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

lua语言是一个非常好用的语言,一个特点是,非常轻量级。二个特点是,非容易扩展。三个特点是,lua与C++互调非常容易。
可以将一个C++中类的大部分方法,都可以绑定成lua语言的一部分。
下面的代码,是绑定我的库中DatetTime类的代码:
 1void InitDateTime(lua_State * L)
 2{
 3    using namespace luabind;
 4    module(L,"zdh")
 5        [
 6            class_<XDate<XAnsiString> >("XDate")
 7            .def(constructor<XInt,XInt,XInt>())
 8            .def(constructor<>())
 9            .def(constructor<XInt>())
10            .def(constructor<const XDate<XAnsiString> &>())
11            .def("SetNowDate",&XDate<XAnsiString>::SetNowDate)
12            .def("GetDay",&XDate<XAnsiString>::getDay)
13            .def("GetMonth",&XDate<XAnsiString>::getMonth)
14            .def("GetYear",&XDate<XAnsiString>::getYear)
15            .def("SetDate",(void (XDate<XAnsiString>::*)(zdh::XInt,zdh::XInt,zdh::XInt))&XDate<XAnsiString>::SetDate)
16            .def("SetDate",(void (XDate<XAnsiString>::*)(zdh::XInt))&XDate<XAnsiString>::SetDate)
17            .def("SetDate",(void (XDate<XAnsiString>::*)(const zdh::XDate<XAnsiString> &))&XDate<XAnsiString>::SetDate)
18            .def("ToString",(zdh::XAnsiString (XDate<XAnsiString>::*)(voidconst)&XDate<XAnsiString>::ToString)
19            .def(self == XDate<XAnsiString>())
20            .def(self < XDate<XAnsiString>())
21            .def(self<=XDate<XAnsiString>())
22        ];
23    //(return_arg-type (classname::*)(arg1-type,grg2-type,))&classname::class_memberfunction
24    //(void(CBase::*)(long))&CBase::Show)
25}
下面是绑定我的库中字符串的代码
void InitString(lua_State * L)
{
    
using namespace luabind;
    module(L,
"zdh")
        [
            class_
<XAnsiString>("XString")
            .def(constructor
<const XChar *>())
            .def(constructor
<>())
            .def(constructor
<const XAnsiString &>())
            .def(
"c_str",(const zdh::XChar * (XAnsiString::*)(voidconst)&XAnsiString::c_str)
            .def(
"getLength",(zdh::XInt (XAnsiString::*)(voidconst)&XAnsiString::getLength)
            .def(
"Trim",(zdh::XAnsiString (XAnsiString::*)(voidconst&XAnsiString::Trim)
            .def(
"Trim",(zdh::XAnsiString & (XAnsiString::*)(zdh::XAnsiString &const)&XAnsiString::Trim)
        ];
}
下面两个,是调用lua的XAnsiString与XDateTime输出的函数。这两个函数在lua中有定义。
void PrintString(const XAnsiString & paramStr)
{
    luabind::call_function
<void>(gL,"printstring",boost::ref(paramStr));
}
void PrintDate(const XDate<XAnsiString> & paramDate)
{
    luabind::call_function
<void>(gL,"printdate",boost::ref(paramDate));
}
下面,就是定义这些函数的lua语言代码
----fun.lua--------
function addint ( x, y )
    
local r = (x + y) * 10
    return r
end
function printstring(s)
    print(s:c_str())
end
function printdate(d)
    printstring(d:ToString())
end
然后,主要使用下面的main,就可以有了一个已经扩展了的lua语言运营环境。
int main(int argc, char * argv[])
{
    lua_State 
*= lua_open();    //初始化lua
    gL 
= L;
    luaL_openlibs(L);    
//载入所有lua标准库
    luaL_dofile(L, 
"add.lua");
    Init(L);
    
string s;
    cout
<<"lua>";
    
while(getline(cin,s))    //从cin中读入一行到s
    {
        
if( s == "exit()" ) 
        {
            break;
        }
        
//载入s里的lua代码后执行
        bool err 
= luaL_loadbuffer(L, s.c_str(), s.length(),
            
"line") || lua_pcall(L, 000);
        
if(err)
        {
            
//如果错误,显示
            cerr 
<< lua_tostring(L, -1);
            
//弹出错误信息所在的最上层栈
            lua_pop(L, 
1);
            cout
<<endl;
        }
        cout
<<"lua>";
    }

    lua_close(L);
//关闭
    return 
0;
}
这里,使用luabind使用lua语言扩展和C++相互调用,非常简单。
posted on 2010-11-05 17:08 冬瓜 阅读(1885) 评论(1)  编辑 收藏 引用 所属分类: 原创

Feedback

# re: 一个luabind简单类绑定 2010-11-07 17:22 expter
下午用了原来LUABIND可以支持。  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理