当Lua绑定在THAT类中时,使用LuaBind在类中调用Lua函数

时间:2011-09-15 23:27:01

标签: c++ class lua luabind

基本上,我只希望能够在Manager类中创建一个干净的Lua实例,然后将类中的函数导出到Lua,这样我就可以在Lua中已经创建的C ++类上调用函数。

这是我正在考虑解决问题的当前方式。它编译但Lua没有任何反应。

有谁知道我做错了什么,或者有人有任何其他建议吗?

Manager.lua

newObject("Object", 1234)
printAll()

Manager.h

#ifndef MANAGER_H
#define MANAGER_H
#include <iostream>
#include <vector>
#include <string>

extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
#include "luabind/luabind.hpp"
#include "Object.h"


class Manager
{
private :
    lua_State *L;
    std::vector<Object> obj;


public :
    Manager();
    void newObject(std::string t, int nm);
    void printAll();

};

#endif

Manager.cpp

#include "Manager.h"
Manager::Manager()
{
luabind::open(L);

luabind::module(L) [
    luabind::class_<Manager>("Manager")
        .def(luabind::constructor<>())
        .def("newObject", &Manager::newObject)
    ];

luaL_dofile(L, "Manager.lua");
}   

void Manager::newObject(std::string t, int nm)
{
    if(t == "Object")
    {
        Object object(nm);
        obj.push_back(object);
    }
}

void Manager::printAll()
{
    for(unsigned int i = 0; i < obj.size(); i++)
        std::cout << obj[i].getNum() << std::endl;
}

1 个答案:

答案 0 :(得分:3)

  

这样我就可以在Lua里面已经创建的C ++类上调用函数。

如果你使用Luabind创建一个类,然后提供该类的成员,那么Luabind就会这样做。它会向具有成员的Lua公开一个类。

如果没有该类类型的对象,则无法在C ++中调用成员函数。因此,当您通过Luabind公开一个类及其成员时,如果没有该类类型的对象,您将无法在Lua中调用成员函数。

因此,如果你有一个全局Manager对象,将它暴露给Lua的正确方法是将对象本身暴露给Lua。使用Luabind获取全局表,然后在其中放置一个指向Manager对象的指针。或者,您可以在执行脚本时将Manager对象实例作为参数传递。

第二种方法可以这样:

//Load the script as a Lua chunk.
//This pushes the chunk onto the Lua stack as a function.
int errCode = luaL_loadfile(L, "Manager.lua");
//Check for errors.

//Get the function from the top of the stack as a Luabind object.
luabind::object compiledScript(luabind::from_stack(L, -1));

//Call the function through Luabind, passing the manager as the parameter.
luabind::call_function<void>(compiledScript, this);

//The function is still on the stack from the load call. Pop it.
lua_pop(L, 1);

您的Lua脚本可以使用Lua的varargs机制获取实例:

local manager = ...
manager:newObject("Object", 1234)
manager:printAll()