Используйте LuaBind для вызова функций Lua внутри класса, когда Lua привязан внутри ЭТОГО класса.

По сути, я просто хочу иметь чистый экземпляр Lua, созданный внутри моего класса Manager, а затем экспортировать функции в классе в Lua, чтобы я мог вызывать функции в уже созданном классе C++ внутри Lua.

Это текущий способ, которым я смотрю на решение проблемы. Он компилируется, но в Lua ничего не происходит.

Кто-нибудь знает, что я делаю неправильно, или у кого-нибудь есть другие предложения?

Manager.lua

newObject("Object", 1234)
printAll()

Менеджер.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;
}

person user947871    schedule 15.09.2011    source источник


Ответы (1)


чтобы я мог вызывать функции уже созданного класса C++ внутри Lua.

Если вы используете 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 может получить экземпляр с помощью механизма varargs Lua:

local manager = ...
manager:newObject("Object", 1234)
manager:printAll()
person Nicol Bolas    schedule 16.09.2011
comment
Большое спасибо за информацию. У вас случайно нет образца кода или вы знаете сайт, на котором есть хороший пример? Я просто пытаюсь разобраться в ситуации. - person user947871; 16.09.2011
comment
Нужно ли оставлять там создание Модуля? - person user947871; 17.09.2011
comment
@ User947871: Да. Луабинд — это не магия; он не может анализировать определение C++ и волшебным образом связывать функции и тому подобное. Вот для чего предназначен код привязки Luabind. Все, что делает этот код, — фактически дает Lua экземпляр класса для использования. - person Nicol Bolas; 17.09.2011
comment
Собственно, у меня есть еще один вопрос. Как только я настрою его, как я могу вызвать функцию Lua из С++ в том же скрипте. Например, я хочу иметь вызываемую Lua-функцию keyPress(), которую я хочу вызывать изнутри C++. - person user947871; 17.09.2011
comment
Неважно, я смог исправить это сам, используя luabind::call_function‹void›(L, keyPress); - person user947871; 17.09.2011