快捷搜索:

如何在C++中集成Lua脚本(LuaPlus篇)

去年我作了一个Lua脚本的C++包装,有许多同伙感兴趣,并考试测验应用,我认为受宠若惊。事实上,我作的包装,进修的目的对照强,它照样有许多缺陷的。为了让同伙们少走弯路,我保举应用LuaPlus作为C++的包装。

LuaPlus是Lua的C++增强,也便是说,LuaPlus本身便是在Lua的源码长进行增强得来的。用它与C++进行相助,是对照好的一个选择。

LuaPlus今朝版本为:LuaPlus for Lua 5.01 Distribution Build 1080 (February 28, 2004)。大年夜家可以到http://luaplus.org/ 站点下载:

源码   (http://wwhiz.com/LuaPlus/LuaPlus50_Build1081.zip)

目标码 (http://wwhiz.com/LuaPlus/LuaPlus50_Build1081_Win32Binaries.zip)

我将鄙人面阐明,若何应用LuaPlus,以及若何更方便的让LuaPlus与C++的类相助无间。

1. 调用Lua脚本

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/skyremember/archive/2008/09/13/2920834.aspx

// 创建Lua说冥器:

LuaStateOwner state;

// 履行Lua脚本:

state->DoString("print('Hello World\n')");

// 载入Lua脚本文件并履行:

state->DoFile("C:\\test.lua");

// 载入编译后的Lua脚本文件并履行:

state->DoFile("C:\\test.luac");

2. 与Lua脚原形互调用

// 为Lua脚本设置变量

state->GetGlobals().SetNumber("myvalue", 123456);

// 得到Lua变量的值

int myvalue = state->GetGlobal("myvalue").GetInteger();

// 调用Lua函数

LuaFunction luaPrint = state->GetGlobal("print");

luaPrint("Hello World\n");

// 让Lua调用C说话函数

int add(int a, int b){ return a+b;}

state->GetGlobals().RegisterDirect("add", add);

state->DoString("print(add(3,4))");

// 让Lua调用C++类成员函数

class Test{public: int add(int a, int b){return a+b;}};

Test test;

state->GetGlobals().RegisterDirect("add", test, add);

state->DoString("print(add(3,4))");

3. 在Lua脚本中应用C++类

这个轻细有点小麻烦。不过,我包装了一个LuaPlusHelper.h的文件,它可以很轻松的完成这个事情。它的实现也很简单,大年夜家可以从源码上来得到若何用纯LuaPlus实现同样的功能。

不过,这里仍旧有一个限定没有办理:不能应用虚成员函数。不过斟酌到我们仅是在Lua调用一下C++函数,并不是要将C++完美的导入到Lua,这个限定完全可以吸收。

别的,类成员变量不能直接在Lua中造访,可以经由过程类成员函数来造访(比如SetValue/GetValue之类)。

// 下面是一个简单的C++类:

class Logger

{

public:

void LOGMEMBER(const char* message)

{

printf("In member function: %s\n", message);

}

Logger()

{

printf("Constructing(%p)...\n", this);

v = 10;

}

virtual ~Logger()

{

printf("Destructing(%p)...\n", this);

}

Logger(int n)

{

printf(" -- Constructing[%d](%p)...\n", n, this);

}

Logger(Logger* logger)

{

printf(" -- Constructing[%p](%p)...\n", logger, this);

logger->LOGMEMBER(" Call From Constructor\n");

}

int SetValue(int val)

{

v = val;

}

int GetValue()

{

return v;

}

public:

int v;

};

// 导入到Lua脚本:

LuaClass(state)

.create("Logger") // 定义构造函数 Logger::Logger()

.create("Logger2")  // 定义构造函数 Logger::Logger(int)

.create("Logger3") // 定义构造函数 Logger::Logger(Logger*)

.destroy("Free")  // 定义析构函数 Logger::~Logger()

.destroy("__gc")  // 定义析构函数 Logger::~Logger()

.def("lm", &Logger::LOGMEMBER)  // 定义成员函数 Logger::LOGMEMBER(const char*)

.def("SetValue", &Logger::SetValue)

.def("GetValue", &Logger::GetValue);

// 在Lua中应用Logger类(1):

state->DoString(

"l = Logger();"  // 调用构造函数 Logger::Logger()

"l.lm('Hello World 1');"  // 调用成员函数 Logger::LOGMEMBER(const char*)

"l.Free();"  // 调用析构函数 Logger::~Logger()

);

// 在Lua中应用Logger类(2):

state->DoString(

"m = Logger(10);" // 调用构造函数 Logger::Logger(int)

"m.lm('Hello World 2');"  // 调用成员函数 Logger::LOGMEMBER(const char*)

"n = Logger(m);" // 调用构造函数 Logger::Logger(Logger*)

"n.lm('Hello World 3');"  // 调用成员函数 Logger::LOGMEMBER(const char*)

"m.SetValue(11);"

"print(m.GetValue());"

"m,n = nil, nil;" // m,n 将由Lua的垃极收受接收来调用析构函数

);

您可能还会对下面的文章感兴趣: