LuaOO (Lua与C++交互的面向对象封装)

说明:

LuaOO是Lua C API使用C++语言的面向对象封装。LuaOO是在lua原有的API基础之上扩展而来,极少地修改lua源码,主要是通过扩展lua原来的代码。扩展lua与C++环境交互。因此当有新版本的lua源码发布时也能够支持。LuaOO的很多接口的命名与lua API类似。LuaOO隐藏了lua栈的操作,LuaOO库将不会提供类似lua_gettop,lua_settop,lua_pushvalue,lua_remove,lua_insert等对栈的操作的接口。

LuaOO主要的类有

 

所有的LuaOO对象都在命名空间lua

 

LuaState

 

主要封装lua的初始化、关闭,.Lua文件的加载执行,创建值为NilLuaObject,以及从Global环境中获取LuaObject、设置LuaObjectGlobal环境中。

 

创建:

l         LuaState *L=LuaState::create();

关闭:

l         L->release();//该会自动回收内存,不要调用delete L来删除

 

切勿在栈上定义LuaState

不建议如下的使用:

LuaState LS;

LS.release();

 

其他操作

    LuaObject newObject();//创建object

    LuaObject getGlobal(const char *name);

    void setGlobal(LuaObject &obj,const char *name);

 

    int loadFile(const char *fileName,const char *mode=0);

int loadBuffer(const char *buff, size_t sz,const char *name, const char *mode=0);

    int loadString(const char *s);

    bool doFile(const char *fileName);

    bool doString(const char *str);

    bool doBuffer(const char *buff, size_t sz,const char *name);

   


LuaObject

 

LuaObjectLuaOO的核心,隐藏了所有栈的操作。可以使用LuaState中的newObject创建对象,newObject并不返回指针,而返回LuaObject对象,因为如果返回指针则需要手动去释放该对象,而返回对象后,当销毁时会调用析构会释放。当调用LuaObject的赋值函数时两个对象会有相同的引用,类似java里的对象。

LuaObject obj1=L->newObject();//创建obj1对象

LuaObject obj2=obj1;//赋值操作obj1obj2有相同的引用,即二者指向的是同一个值。

obj1.setNumber(123);//设置obj1的值为123

obj2.toNumber()//获得123

 

如果想获得一份obj1的拷贝则可以调用clone函数

LuaObject obj2=obj1.clone();

obj1.setNumber(123);//设置obj1的值为123

obj2.toNumber()//不会得到123,因为obj2的值依然是Nil

 

LuaObject对象创建后默认值是Nil,可以调用set* ()函数来设置相应的值,调用is*()来判断值的类型。调用to*()可以获取值。

    LuaObject o1=L->newObject();

    o1.setString("Hello world!!!");

    LuaObject o2= L->newObject();

    o2.setUInt(12345);

       printf(o1.toString());//打印字符Hello world!!!

 

支持设置C++函数到LuaObject

如下:

 

void test()

{

       printf(“Hello”);

}

 

 

LuaObject f=L->newObject();

f.setFunction(test);

L->setGlobal(f,test);

 

可以在lua环境中调用test()函数

test.lua文件内容

test()

 

L->doFile(test.lua);

输出Hello

 

class Test

{

public:

       void test()

{

       printf(“Test::test”);

}

 

};

 

Test t;

LuaObject f2=L->newObject();

f.setFunction(t,test);

L->setGlobal(f,test2);

 

可以在lua环境中调用test2()函数

输出Test::test

 

对表的操作如下:

    bool addTable(const char* key,LuaObject &obj);

    bool addTable(int key,LuaObject &obj);

    LuaObject getTable(const char* key);

    LuaObject getTable(int key);

 

LuaObject table=L->newObject();

table.setTable(0,0);

 

table.addTable(o1,o1);

 

LuaObject g=L->newObject();

g=table.getTable(“o1”);

 

可以为LuaObject设置metaTable

调用   

LuaObject getMetaTable();

    void setMetaTable(const LuaObject &metaTable);

来完成

    LuaObject mt=L->newObject();

    mt.setTable(10,0);//Table

       mt.addTable(“data”,o1);

       LuaObject obj=L->newObject();

       obj. getMetaTable(mt);

       调用setMetaTable()就可以获取MetaTable了

 

LuaIterator类

 

对表的遍历可以使用该类使用如下

如果key的类型为数字调用key().toString()会导致遍历的失败

见lua 说明文档

While traversing a table, do not call lua_tolstring directly on a key, unless you know that the key is actually a string. Recall that lua_tolstring may change the value at the given index; this confuses the next call to lua_next.

 

    LuaObject k=L->newObject();

 

    LuaIterator I=table.begin(k);

   

    while(I.next())

    {

       printf("key=%d\t",I.key().toString());

       printf("value=%s\n",I.value().toString());

    }

 

LuaFunction类

该类用于实现在C++环境中调用lua函数的功能。

LuaObjFunctionLuaObjFunctionVoidLuaFunctionLuaFunctionVoid类提供的功能类似。

LuaObjFunction提供以LuaObject作为参数,并返回LuaObjectlua函数的执行,LuaObjFunctionVoid 提供以LuaObject作为参数,无返回值的lua函数的执行,LuaFunction提供以一般类型作为参数,并返回LuaObjectlua函数的执行。LuaFunctionVoid提供以一般类型作为参数,无返回值的lua函数的执行。

 

用法如下:

LuaFunction luafunc=L->getGlobal(“add”);

LuaObject r=luafunc(1,2);

printf(“%d”,r.toInt());

 

点击下载链接库

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值