类的注册是以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>