设为首页 加入收藏

TOP

LuaBridge为Lua绑定C/C++对象(二)
2014-04-06 17:35:29 来源: 作者: 【 】 浏览:220
Tags:LuaBridge Lua 绑定 C/C 对象

 

  类的注册是以beginClass或deriveClass开始,以endClass结束。一个类注册完后,还可以使用beginClass重新注册更多的信息,但是deriveClass只能被使用一次。为了给已经用deriveClass注册的类,注册更多的信息,可以使用beginClass.

  <span style="font-size:14px;">  class A {

  public:

  A() { printf("A constructor\n");}

  static int staticData;

  static int getStaticData() {return staticData;}

  static float staticProperty;

  static float getStaticProperty () { return staticProperty; }

  static void setStaticProperty (float f) { staticProperty = f; }

  static int staticCFunc (lua_State *L) { return 0; }

  std::string dataMember;

  char dataProperty;

  char getProperty () const { return dataProperty; }

  void setProperty (char v) { dataProperty = v; }

  void func1 () {printf("func1 In Class A\n"); }

  virtual void virtualFunc () {printf("virtualFunc In Class A\n");  }

  int cfunc (lua_State* L) { printf("cfunc In Class A\n");  return 0; }

  };

  class B : public A {

  public:

  B() { printf("B constructor\n");}

  double dataMember2;

  void func1 () {printf("func1 In Class B\n"); }

  void func2 () { printf("func2 In Class B\n"); }

  void virtualFunc () {printf("virtualFunc In Class B\n");  }

  };

  int A::staticData = 3;

  float A::staticProperty = 0.5;</span>

  按下面方式注册:

  <span style="font-size:14px;">    getGlobalNamespace (L)

  .beginNamespace ("test")

  .beginClass<A>("A")

  .addConstructor <void (*) (void)> ()

  .addStaticData ("staticData", &A::staticData)

  .addStaticProperty ("staticProperty", &A::getStaticData)

  .addStaticFunction ("getStaticProperty", &A::getStaticProperty) //read-only

  .addStaticCFunction ("staticCFunc", &A::staticCFunc)

  .addData ("data", &A::dataMember)

  .addProperty ("prop", &A::getProperty, &A::setProperty)

  .addFunction ("func1", &A::func1)

  .addFunction ("virtualFunc", &A::virtualFunc)

  .addCFunction ("cfunc", &A::cfunc)

  .endClass ()

  .deriveClass<B, A>("B")

  .addConstructor <void (*) (void)> ()

  .addData ("data", &B::dataMember2)

  .addFunction ("func1", &B::func1)

  .addFunction ("func2", &B::func2)

  .endClass ()

  .endNamespace ();</span>

  注册后,可以再Lua脚本中按一下方式使用:

  <span style="font-size:14px;">  local AClassObj = test.A ()  --create class A instance

  print("before:",test.A.staticData) -- access class A static member

  test.A.staticData = 8  -- modify class A static member

  print("after:",test.A.staticData)

  print("before:", test.A.getStaticProperty())

  --test.A.staticProperty = 1.2 --error:can not modify

  print("staticCFunc")

  test.A.staticCFunc()

  AClassObj.data = "sting"

  print("dataMember:",AClassObj.data)

  AClassObj.prop = 'a'

  print("property:",AClassObj.prop)

  AClassObj:func1()

  AClassObj:virtualFunc()

  AClassObj:cfunc()

  BClassObj = test.B()

  BClassObj:func1()

  BClassObj:func2()

  BClassObj:virtualFunc()     </span>

  其输出结果为:

  <span style="font-size:14px;">  A constructor

  before: 3

  after:  8

  before: 0.5

  staticCFunc

  dataMember:     sting

  property:       a

  func1 In Class A

  virtualFunc In Class A

  cfunc In Class A

  A constructor

  B constructor

  func1 In Class B

  func2 In Class B

  virtualFunc In Class B</span>

        

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C/C++位操作初步 下一篇C++ 中的处理类型

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C语言指针从入门到基 (2025-12-26 05:21:36)
·【C语言指针初阶】C (2025-12-26 05:21:33)
·C语言指针的定义和使 (2025-12-26 05:21:31)
·在 Redis 中如何查看 (2025-12-26 03:19:03)
·Redis在实际应用中, (2025-12-26 03:19:01)