tolua++初探(八)(转)

这次多定义了两个函数toDerived1和toDerived2,全局的。我们也可以把他们直接放在类中,或者一个MODULE中。module大概是 类似的namespace的东西,把一堆杂七杂八的家什如变量、常量、函数、类实例等放在一起,在lua中通过"."来访问。下面是手册中的例子:

module mod {

#define N

extern int var;

int func (...):

}

    这样我们可以在lua中用mod.N,mod.var,mod.func来访问其成员。     原本toDerived*的参数是CBase*,但是从C++向Lua函数传参数的时候我调用了lua_pushlightuserdata,结果在脚本 中报错,说toDerived*应当接受CBase*而非userdata。于是干脆把参数修改成void*,这下lua不再叫唤了。     好了,到了列出驱动文件的时候了。CallLuaFunc.cpp:

#include "lua.hpp"

#include "tlclass.h"

CDerived1 * toDerived1(void * p){

    return dynamic_cast<CDerived1*>((CBase*)p); }

CDerived2 * toDerived2(void * p){

    return dynamic_cast<CDerived2*>((CBase*)p); }

int tolua_calllua_open(lua_State*);

int _tmain(int argc, _TCHAR* argv[]){

     lua_State * L = luaL_newstate();

     luaopen_base(L);

     tolua_calllua_open(L);

     //call lua function

     luaL_dofile(L, "..\scripts\CallLuaFunc.lua");   

     CBase * p1 = new CDerived1();

     CBase * p2 = new CDerived2();   

    //call Derived1Test

     lua_getglobal(L, "Derived1Test"); 

    lua_pushlightuserdata(L, p1);

    if( lua_pcall(L, 1, 0, 0) != 0 ) {

         fprintf(stderr, "call Derived1Test failed:%s ", lua_tostring(L, -1));    }

    //call Derived2Test

     lua_getglobal(L, "Derived2Test");

     lua_pushlightuserdata(L, p2);

    if( lua_pcall(L, 1, 0, 0) != 0 ){

         fprintf(stderr, "call Derived2Test failed:%s ", lua_tostring(L, -1));

     }

     printf("This info is print in C++! CDerived2.GetNumber()=%d ",

              ((CDerived2*)p2)->GetNumber());

     delete p1;

     delete p2;

     lua_close(L);

    return 0; }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值