LuaOO (Lua与C++交互的面向对象封装)
2012-10-20 08:43
656 查看
说明:
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文件的加载执行,创建值为Nil的LuaObject,以及从Global环境中获取LuaObject、设置LuaObject到Global环境中。
创建:
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 obj1=L->newObject();//创建obj1对象
LuaObject obj2=obj1;//赋值操作obj1与obj2有相同的引用,即二者指向的是同一个值。
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
a string. Recall that
index; this confuses the next call to
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函数的功能。
LuaObjFunction、LuaObjFunctionVoid、LuaFunction和LuaFunctionVoid类提供的功能类似。
LuaObjFunction提供以LuaObject作为参数,并返回LuaObject的lua函数的执行,LuaObjFunctionVoid
提供以LuaObject作为参数,无返回值的lua函数的执行,LuaFunction提供以一般类型作为参数,并返回LuaObject的lua函数的执行。LuaFunctionVoid提供以一般类型作为参数,无返回值的lua函数的执行。
用法如下:
LuaFunction luafunc=L->getGlobal(“add”);
LuaObject r=luafunc(1,2);
printf(“%d”,r.toInt());
点击下载链接库
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文件的加载执行,创建值为Nil的LuaObject,以及从Global环境中获取LuaObject、设置LuaObject到Global环境中。
创建:
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
LuaObject是LuaOO的核心,隐藏了所有栈的操作。可以使用LuaState中的newObject创建对象,newObject并不返回指针,而返回LuaObject对象,因为如果返回指针则需要手动去释放该对象,而返回对象后,当销毁时会调用析构会释放。当调用LuaObject的赋值函数时两个对象会有相同的引用,类似java里的对象。LuaObject obj1=L->newObject();//创建obj1对象
LuaObject obj2=obj1;//赋值操作obj1与obj2有相同的引用,即二者指向的是同一个值。
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_tolstringdirectly on a key, unless you know that the key is actually
a string. Recall that
lua_tolstringmay 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函数的功能。
LuaObjFunction、LuaObjFunctionVoid、LuaFunction和LuaFunctionVoid类提供的功能类似。
LuaObjFunction提供以LuaObject作为参数,并返回LuaObject的lua函数的执行,LuaObjFunctionVoid
提供以LuaObject作为参数,无返回值的lua函数的执行,LuaFunction提供以一般类型作为参数,并返回LuaObject的lua函数的执行。LuaFunctionVoid提供以一般类型作为参数,无返回值的lua函数的执行。
用法如下:
LuaFunction luafunc=L->getGlobal(“add”);
LuaObject r=luafunc(1,2);
printf(“%d”,r.toInt());
点击下载链接库
相关文章推荐
- C和C++的面向对象专题(4)——解决封装,避免接口
- C++学习笔记 _________________________面向对象部分 类 封装 - 01
- C++中面向对象和基于对象的线程封装方法
- C++之面向对象程序设计的基本特点(抽象、封装、继承、多态)
- (JAVA SE 学习笔记)Java.SE.第009讲.面向对象之封装
- 黑马程序员_Java面向对象1_封装
- C++面向对象高级开发_极客班_第二节课笔记
- cocos2d-x学习笔记(十一)c++与lua交互回调函数的处理
- Java面向对象之封装
- Java 面向对象 : 封装
- JavaScript 面向对象程序设计(上)——封装[转]
- C/C++:C++面向对象
- Java基础 - 面向对象思想,匿名对象,封装
- 面向对象之封装,继承,多态(上)
- 转 C++ 面向对象程序设计的基本特点
- C++与QML交互1:在C++中调用QML对象
- OC面向对象特性:封装
- JavaScript 面向对象程序设计(上)——封装[转]
- JavaScript面向对象程序设计(8): 优雅的封装还是执行的效率?
- 1.面向对象基础(封装、继承、多态、抽象类)0711