<使用了聚合的类的导出> 聚合是最常见的构造新类的方式了,另一个是继承。tolua++支持单继承,后面会提到继承的例子。这里先看看怎么将利用了聚合的类导出到lua中。 我的目的是想在Lua中使用C++类的实例,而不是在lua中生成C++类实例,所以我在利用tolua++向lua导出类时一般不导出构造函数,这样就无法在lua中生成类实例。 但是为了演示的方便,这个例子中用到的两个简单类CNumber和CMessage仍然导出了构造函数。 另外一个单件(singleton)CTestSystem的构造函数、拷贝构造函数、=操作符都被声明为protected,在向lua导出时只导出了几个方法。你无法在lua中生成它的实例,即便在C++中也不行,只能通过其静态成员函数GetSingleton()获取。 实际的头文件classg.h如下:
接下来是pkg文件:
我只导出需要的部分。有点遗憾的是,tolua++的手册中说无法通过"@"修改你要导出的类的名字,这样的话,如果我想在lua中使用另外的名字,就要用别的办法了(文档中说$renaming可以,未试验,存疑)。 驱动部分和之前的例子中类似:
#ifndef _CLASSGROUP_H
#define
_CLASSGROUP_H
#include
<
string
.h
>
class
CNumber
{ //tolua_export public: tolua_begin CNumber():m_nNum(0) { } CNumber(int num):m_nNum(num) { } ~CNumber() void SetNumber( num) { m_nNum = num; } GetNumber() { return m_nNum; } Add( num) += num; tolua_end protected m_nNum; }
;
//
tolua_export
tolua_begin
CMessage
{ tolua_end CMessage() { strcpy(m_szMessage, "initial message); } CMessage(char *initmsg) if(initmsg) strncpy(m_szMessage, initmsg,0);">256CMessage() SetMessage(msg) (msg) { strncpy(m_szMessage, msg,0);">); } }GetMessage() m_szMessage; } ShowMessage() { printf(this message is printed in c++ code when lua call ShowMessage:%s , m_szMessage); } m_szMessage[]; }
tolua_export
CTestSystem
: static CTestSystem & GetSingleton(){ CTestSystem sys; sys;} CNumber GetNumberObj() m_Number;} CMessage GetMessageObj() m_Message;}: CTestSystem(){} CTestSystem(const CTestSystem); CTestSystem operator( rhs); CTestSystem() private: CNumber m_Number; CMessage m_Message; }
;
#endif
$#include
"
classg.h
CNumber
CNumber(); CNumber( num); CNumber(); GetNumber( }
CMessage
CMessage(); CMessage( initmsg); CMessage(msg); GetMessage(); ShowMessage(); CTestSystem
{ GetSingleton(); CNumber GetNumberObj(); CMessage GetMessageObj(); }
;
#include
#include
lua.hpp
int
tolua_classgroup_open(lua_State
*
);
_tmain(
argc, _TCHAR
argv[])
{ lua_State L luaL_newstate(); luaopen_base(L); tolua_classgroup_open(L); luaL_dofile(L,0);">../scripts/classgroup.lua); lua_close(L); ; }