|
|
发表于 2007-7-30 17:56:00
|
显示全部楼层
Re:如何在LUA中调用C++的类成员函数
cpp文件:
using namespace std;
class obj
{
public:
obj() : val( 0 ) {}
void set( double v ) { val = v; }
double get( void ) { return val; }
private:
double val;
};
class lua_bind
{
public:
static void reg( lua_State* lua )
{
lua_newtable( lua );
int tbl = lua_gettop( lua );
luaL_newmetatable( lua, "obj" );
int meta_tbl = lua_gettop( lua );
lua_pushliteral( lua, "__metatable" );
lua_pushvalue( lua, tbl );
lua_settable( lua, meta_tbl );
lua_pushliteral( lua, "__index" );
lua_pushvalue( lua, tbl );
lua_settable( lua, meta_tbl );
lua_pushliteral( lua, "__gc" );
lua_pushcfunction( lua, gc );
lua_settable( lua, meta_tbl );
lua_pop( lua, 1 );
luaI_openlib( lua, 0, functions, 0 );
lua_pop( lua, 1 );
lua_register( lua, class_name, build );
}
static int build( lua_State* lua )
{
obj* p = new obj();
*( void** )( lua_newuserdata( lua, sizeof( void* ) ) ) = p;
luaL_getmetatable( lua, class_name );
lua_setmetatable( lua, -2 );
cout << "build object, val is 0" << endl;
return 1;
}
static int gc( lua_State* lua )
{
obj* p = ( obj* )( *( void** )( lua_touserdata( lua, 1 ) ) );
delete p;
cout << "object gc" << endl;
return 0;
}
static int set_val( lua_State* lua )
{
obj* p = ptr( lua, 1 );
double val = luaL_checknumber( lua, 2 );
p->set( val );
cout << "set value to " << val << endl;
return 0;
}
static int get_val( lua_State* lua )
{
obj* p = ptr( lua, 1 );
double val = p->get();
lua_pushnumber( lua, val );
cout << "get value is " << val << endl;
return 1;
}
static obj* ptr( lua_State* lua, int narg )
{
luaL_checktype( lua, narg, LUA_TUSERDATA );
void* ud = luaL_checkudata( lua, narg, class_name );
if( ud )
return *( obj** )ud;
luaL_typerror( lua, narg, class_name );
return 0;
}
static const char class_name[];
static const luaL_reg functions[];
};
const char lua_bind::class_name[] = "obj";
const luaL_reg lua_bind::functions[] =
{
{ "set", lua_bind::set_val },
{ "get", lua_bind::get_val },
{ 0, 0 }
};
void test0x( lua_State* lua )
{
lua_bind::reg( lua );
luaL_dofile( lua, "script0x.lua" );
}
脚本文件:
o = obj();
o:set( 50 );
o:get(); |
|