<将简单C++类导出到lua>
利用tolua++导出类到lua中简单方便,你可以导出静态成员函数、普通成员函数、静态成员变量、普通成员变量,你也可以指定类的哪些方法被导出。你可以将具有单继承的派生类导出,派生类可以很自然地访问基类的方法。更多的细节,请参考 tolua++的在线文档。
首先生成实际的c++头文件,定义我们要导出的类。tclass.h内容如下:
为了方便,我把实现也放在了头文件中。 接下来定义pkg文件,tclass.pkg。
和我们的第一个数组的例子一样,包含实际的C头文件,用tolua++的语法声明你想导出的部分。在导出类的时候,构造函数被映射到lua中的new,析 构函数被映射为delete。他们的用法可以在后面的lua代码中看到。接下来就是用tolua++.exe生成用于完成“导出类到lua”功能的CPP 文件了。
tolua
++
.exe
-
n tclass
-
o tclass.cpp tclass.pkg
把tclass.h和tclass.cpp加入到工程中。编写驱动代码,调用lua脚本文件。这部分如下:
编写lua脚本文件classtest.lua,内容如下:
OK,简单的几步工作,我们已经可以在lua中使用C++类了。
有两点要注意:
1.pkg文件要包含实际的C头文件。
2.pkg文件中要声明需要导出到lua中的类,类名与实际的C头文件中的一样,只声明你想导出的部分即可。
利用tolua++导出类到lua中简单方便,你可以导出静态成员函数、普通成员函数、静态成员变量、普通成员变量,你也可以指定类的哪些方法被导出。你可以将具有单继承的派生类导出,派生类可以很自然地访问基类的方法。更多的细节,请参考 tolua++的在线文档。
首先生成实际的c++头文件,定义我们要导出的类。tclass.h内容如下:
#ifndef _TESTCLASS_H 
#define _TESTCLASS_H

#include < string .h >
class
CNumber
... {
//tolua_export
public:
//tolua_begin
CNumber():m_nNum(0)...{ }
CNumber(int num):m_nNum(num)...{ }
~CNumber() ...{ }
void SetNumber(int num)
{ m_nNum = num; }
int GetNumber()
...{ return m_nNum; }
int Add(int num) ...
{
m_nNum += num;
return m_nNum;
}
//tolua_end
protected:
int m_nNum;
} ;
// tolua_export
// tolua_begin
class CMessage
...
{
//tolua_end
public:
//tolua_begin
CMessage() ...{ strcpy(m_szMessage, "initial message"); }
CMessage(char *initmsg) ...{ if(initmsg) strncpy(m_szMessage, initmsg, 256); }
~CMessage() ...{ }
void SetMessage(char *msg) ...{ if(msg) ...{ strncpy(m_szMessage, msg, 256); } }
char *GetMessage() ...{ return m_szMessage; }
void ShowMessage() ...
{
printf("this message is printed in c++ code when lua call ShowMessage:%s ", m_szMessage);
}
//tolua_end
protected:
char m_szMessage[256];
} ;
// tolua_export
#endif

#define _TESTCLASS_H


#include < string .h >


... {
//tolua_export
public:
//tolua_begin
CNumber():m_nNum(0)...{ }
CNumber(int num):m_nNum(num)...{ }
~CNumber() ...{ }
void SetNumber(int num)
{ m_nNum = num; }
int GetNumber()
...{ return m_nNum; }
int Add(int num) ...
{
m_nNum += num;
return m_nNum;
}
//tolua_end
protected:
int m_nNum;
} ;
// tolua_export


// tolua_begin

class CMessage

//tolua_end
public:
//tolua_begin
CMessage() ...{ strcpy(m_szMessage, "initial message"); }
CMessage(char *initmsg) ...{ if(initmsg) strncpy(m_szMessage, initmsg, 256); }
~CMessage() ...{ }
void SetMessage(char *msg) ...{ if(msg) ...{ strncpy(m_szMessage, msg, 256); } }
char *GetMessage() ...{ return m_szMessage; }
void ShowMessage() ...
{
printf("this message is printed in c++ code when lua call ShowMessage:%s ", m_szMessage);
}
//tolua_end
protected:
char m_szMessage[256];
} ;
// tolua_export


#endif
为了方便,我把实现也放在了头文件中。 接下来定义pkg文件,tclass.pkg。
$#include
"
tclass.h
"
class
CNumber
...
{
//tolua_export
public:
//tolua_begin
CNumber();
CNumber(int num);
~CNumber(void);
void SetNumber(int num);
int GetNumber(void);
int Add(int num);
//tolua_end
} ;
// tolua_export
// tolua_begin
class CMessage
...
{
//tolua_end
public:
//tolua_begin
CMessage(void);
CMessage(char * initmsg);
~CMessage(void);
void SetMessage(char *msg);
char *GetMessage();
void ShowMessage();
//tolua_end
} ;
// tolua_export


//tolua_export
public:
//tolua_begin
CNumber();
CNumber(int num);
~CNumber(void);
void SetNumber(int num);
int GetNumber(void);
int Add(int num);
//tolua_end
} ;
// tolua_export

// tolua_begin

class CMessage

{
//tolua_end
public:
//tolua_begin
CMessage(void);
CMessage(char * initmsg);
~CMessage(void);
void SetMessage(char *msg);
char *GetMessage();
void ShowMessage();
//tolua_end
} ;
// tolua_export

#include
"
lua.hpp
"
#include " tclass.h "
int tolua_tclass_open(lua_State * );
int _tmain( int argc, _TCHAR * argv[])
...
{
lua_State *L = luaL_newstate();
luaopen_base(L);
tolua_tclass_open(L);
luaL_dofile(L, "..\scripts\classtest.lua");
lua_close(L);
return 0;
}
#include " tclass.h "


int tolua_tclass_open(lua_State * );


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

lua_State *L = luaL_newstate();
luaopen_base(L);
tolua_tclass_open(L);
luaL_dofile(L, "..\scripts\classtest.lua");
lua_close(L);
return 0;
}

print(
"
now in classtest.lua!
"
)

-- new a CNumber Object
print( " now allocate a CNumber Object: " )
num = CNumber: new ()
num2 = CNumber: new ( 222 )
print( " init, num: " ..num:GetNumber())
print( " init, num2: " ..num2:GetNumber())
print( " now call SetNumber(6) " )
num:SetNumber( 6 )
print( " now the num: " ..num:GetNumber());
num:delete()
print( " num is deleted, access GetNumber is invalid! " )
print(
"
invalid call, result:
"
..num:GetNumber())
-- new a CMessage Object
msg = CMessage: new ()
print( " init msg: " ..msg:GetMessage())
print(
"
now change the msg by call msg:SetMessage('changed message')
"
)
msg:SetMessage(
"
changed message
"
)
print( " now msg: " ..msg:GetMessage())
msg:ShowMessage()
msg:delete()
print( " msg is deleted, access GetMessage is invalid! " )
print(
"
inivalid call, result:
"
..msg:GetMessage())


-- new a CNumber Object
print( " now allocate a CNumber Object: " )

num = CNumber: new ()

num2 = CNumber: new ( 222 )

print( " init, num: " ..num:GetNumber())
print( " init, num2: " ..num2:GetNumber())
print( " now call SetNumber(6) " )
num:SetNumber( 6 )
print( " now the num: " ..num:GetNumber());
num:delete()
print( " num is deleted, access GetNumber is invalid! " )



-- new a CMessage Object

msg = CMessage: new ()

print( " init msg: " ..msg:GetMessage())


print( " now msg: " ..msg:GetMessage())
msg:ShowMessage()
msg:delete()
print( " msg is deleted, access GetMessage is invalid! " )

有两点要注意:
1.pkg文件要包含实际的C头文件。
2.pkg文件中要声明需要导出到lua中的类,类名与实际的C头文件中的一样,只声明你想导出的部分即可。