LuaBridge 中C++类和继承示例

luabridge不是一个陌生的名字,GIT上已经有3-4年多没有更新。将lua和C++相互调用封装的很方便,比如以下示例代码:

//////////////////////////////////////////////////////////////////////////
// test code for luabridge

class A
{
public:
  A()
  {

  }

  ~A()
  {

  }

public:
  std::string get_title() const
  {
    return title;
  }

  void set_title( const std::string& s )
  {
    title = s;
  }

private:
  std::string title;
};

class B : public A
{
public:
  B() : A()
  {

  }

  ~B()
  {

  }
};

void trace( const std::string& strOutput)
{
  OutputDebugStringA(strOutput.c_str());
  OutputDebugStringA("\n");
}

class lua_test
{
public:
  lua_test()
    : L_(0)
    , B_()
  {
    L_ = luaL_newstate();
    luaL_openlibs(L_);
    luaopen_string(L_);

    luabridge::getGlobalNamespace( L_ )
      .addFunction( "trace", trace )
      .beginNamespace( "test" )
        .beginClass< A >( "A" )
          .addConstructor <void (*) (void)> ()
          .addProperty( "title", &A::get_title, &A::set_title )
        .endClass()

        .deriveClass< B, A >( "B" )
          .addConstructor <void (*) (void)> ()
        .endClass()
      .endNamespace()
    ;
  }

  ~lua_test()
  {
    lua_close( L_ );
  }

  bool run( )
  {
    luabridge::setglobal<A*>( L_, (A*)&this->B_, "classb" );
    B_.set_title( "B.title ");

    std::string lua_string;
    FILE* f = fopen( "D:/test.lua", "r" );
    if( f ) {
      char buf[2048] = {0};
      int r = fread( buf, 1, sizeof( buf ), f );
      if( r > 0 )
        lua_string = std::string( buf, r );
      fclose( f );
      f = 0;
    }

    try
    {
      //2.加载Lua文件
      int bRet = luaL_loadstring( L_, lua_string.c_str() );
      if(bRet) {
        OutputDebugStringA(lua_tostring( L_, -1 ) );
        return false;
      }

      //3.运行Lua文件   CHttpCall::~CHttpCall
      bRet = lua_pcall( L_, 0, 0, 0);
      if(bRet)
      {
        OutputDebugStringA(lua_tostring( L_, -1 ) );
        return false;
      }
    } catch (...) {
      OutputDebugStringA( lua_tostring( L_, -1 ) );
    }
    return true;
  }

private:
  lua_State* L_;
  B B_;
};

// 运行代码

lua_test t;
  t.run();

lua_test 打开D:/test.lua文件并执行test_func方法,该方法创建了一个B的实例并打印实例的title属性以及全局对象classb的title属性

test.lua:

function test_func()
  local a = test.B();
  a.title = "abcdefg";
  trace( a.title )
  trace( classb.title );
end

test_func();

在此记录一下。

时间: 2024-10-31 17:23:31

LuaBridge 中C++类和继承示例的相关文章

Android Studio中查看类的继承关系

查看类的继承关系的快捷键F4,在Android Studio常用快捷键这篇文章中,有写了.今天主要是讲一些关于这个快捷键出来的界面的一些配置,这块功能相对偏冷一些,可能很多人都会用不到.但是关于这些配置,android studio中很多都是类似的. 废话不多说,直接上图,如下图,我选中Activity,然后按F4,右边会出现一个和Activity有继承关系的图. 1.先简要分析下图中几个元素: 注:这边说第几个图标是从左到右的顺序来数的 第一个图标:显示所有的继承关系,包括父类,子类 第二个图

关于Python中的类普通继承与super函数继承

关于Python中的类普通继承与super函数继承 1.super只能用于新式类 2.多重继承super可以保公共父类仅被执行一次 一.首先看下普通继承的写法 二.再看看super继承的写法 参考链接:http://blog.csdn.net/lqhbupt/article/details/19631991

[Android Studio] Android Studio中查看类的继承关系

转载自:http://blog.csdn.net/hyr83960944/article/details/38098091 查看类的继承关系的快捷键F4,在Android Studio常用快捷键这篇文章中,有写了.今天主要是讲一些关于这个快捷键出来的界面的一些配置,这块功能相对偏冷一些,可能很多人都会用不到.但是关于这些配置,android studio中很多都是类似的. 废话不多说,直接上图,如下图,我选中Activity,然后按F4,右边会出现一个和Activity有继承关系的图. 1.先简

java中阻止类的继承

1.使用final来修饰类 final表示这个类是继承树的末端,不能被继承. 2.将类的构造方法声明为private的,再提供一个static的方法来返回一个类的对象. JAVA语言要求继承时必须在构造器里的第一行来调用(call)超类(super class)的构造器. 这个是启动继承特征所必须的. 在JAVA中,我们通过调用super()这个方法来完成这个任务,它将会映射到一个超类的构造器中. 如果你没有给父类提供一个默认的构造器,那么编译器将会插入一个默认的超类构件器用来调用.当将父类的构

js中,类的继承

创建类:class student{    constructor(name,age){        this.name=name;        this.age=age;    }    learn(){        console.log('我是学生');    }}类的继承:class child extends Student{    constructor(name,age){        super (name,age);    }    coolings(){      

C++中class(类)与继承白话学习笔记

1.class(类) class Drink{//定义饮料类 public://public下面的东西可以被外面访问 char* type;//饮料种类 double price;//饮料价格 double volume;//饮料体积 double currentVolume;//饮料剩余体积 bool isEmpty();//判是否喝完:成员函数(member function) void addDrink(double vol);//添加饮料:成员函数 Drink();//初始化函数,用于初

lua中基类和“继承机制”

基类:基类定义了所有对于派生类来说普通的属性和方法,派生类从基类继承所需的属性和方法,且在派生类中增加新的属性和方法. 继承:继承是C++语言的一种重要机制,它允许在已定义的类的基础上产生新类. lua基类和C++基类极为相似,但是lua中却没有继承这一说,更没有所谓的派生类.lua只能通过一种行为(元表)来模拟C++继承这一方法. 元表:lua中提供的元表是用于帮助lua数据变量完成某些非预定义功能的个性化行为,当它做某一种操作,然而self表中却没有定义实现这种操作的方法,那么为了实现这一操

Pyhon学习笔记2:Python中的类的继承

代码: class A():     def add(self,a,b):         return a+b class B(A):     def sub(self,a,b):         return a-b print(B().add(4,5)) 结果: Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)] on win32 Type "copyright"

Python类的继承示例

class Pet: __name = "" def __init__(self, name): self.__name = name def bark(self): return "Pet : " + self.__name def getName(self): return self.__name; class Dog(Pet): __age = -1 def __init__(self, name, age): Pet.__init__(self, name)