luabind — с на lua на c

#c #luabind

#c #luabind

Вопрос:

У меня проблема с luabind, или, по крайней мере, я ожидаю, что это проблема

У меня есть класс сущности, который я зарегистрировал в lua,

в идеале я хочу подклассировать его и переопределить его функции, оттуда я хочу отправить его обратно на c и сохранить его

кроме того, я хочу иметь возможность вызывать его новые функции с c из сохраненного объекта / указателя

однако в настоящее время я пытаюсь заставить c вернуть объект типа cEntity * обратно? в скрипте lua я могу загрузить класс, вызвать его переменные и функции, я пытаюсь отправить его в takeClass или takebOject, но он выходит как пустой класс, в котором ничего не установлено

например, foo-> name — это «», а не «Entity1», а идентификатор равен 0, а не 1

любые идеи, что я делаю не так? я искал в Google как минимум неделю, но мне не удалось понять эту проблему и полностью остановить мой прогресс в моем проекте?

 //#######################################################################
// Test function
//#######################################################################
void luaTest::TakeClass(cEntity* foo)
{

    cout << foo->name << endl;
}

void luaTest::TakeObject(luabind::object foo)
{
    cEntity* foobar = luabind::object_cast<cEntity*>(foo);
    cout << foobar->name << endl;
}

void luaTest::luabindClass(lua_State* L)
{
    //Somewhere else
    module(L)
        [
            class_<luaTest>("luaTest")
            .def(constructor<>())
            .def("TakeClass", amp;luaTest::TakeClass)
            .def("TakeObject", amp;luaTest::TakeObject)
        ];
    globals(L)["test"] = this;
}


//#######################################################################
// Entiy Class
//#######################################################################

class cEntity
{
public:
    string name;
    int id;

    cEntity();
    ~cEntity();

    static void luabindClass(lua_State* L);
};

//#######################################################################
cEntity::cEntity()
{
    name = "NotSet";
    id = 0;
}


cEntity::~cEntity()
{
}

void cEntity::luabindClass(lua_State* L)
{
    module(L)
        [
            class_<cEntity>("cEntity") 
            .def(constructor<>()) 
            .def_readwrite("name", amp;cEntity::name)
            .def_readwrite("id", amp;cEntity::id)
        ];
}


//#######################################################################
// Lua File
//#######################################################################
entity = cEntity();
entity.name = "Entity1";
entity.id = 1;

test:TakeClass(entity);
test:TakeObject(entity);
//#######################################################################

//#######################################################################
// main

//#######################################################################
....
/* run the script */
if (luaL_dofile(L, "avg.lua")) {
    std::cout << lua_tostring(L, -1) << std::endl; // Print out the error message
}
....
//#######################################################################
  

Ответ №1:

https://gist.github.com/take-cheeze/7264dbf1ea6e08a2d24a

 #include <iostream>
#include <string>
#include "luabind/luabind.hpp"

extern "C" {
#include "lauxlib.h"
#include "lualib.h"
}



class cEntity
{
 public:
  std::string name;
  int id;

  cEntity();
  ~cEntity();


  std::string getName() { return name; }
  void setName(std::string n) { name = n; }

  int getID() { return id; }
  void setID(int n) { id = n; }


  virtual void testFunction(){};
  static void luabindClass(lua_State* L);
};

//#######################################################################
// Test function
//#######################################################################
struct luaTest {
  void TakeClass(cEntity* foo)
  {
    std::cout << foo->name << std::endl;
  }

  void TakeObject(luabind::object foo)
  {
    cEntity* foobar = luabind::object_cast<cEntity*>(foo);
    std::cout << foobar->name << std::endl;
  }

  void luabindClass(lua_State* L)
  {
    //Somewhere else
    luabind::module(L)
        [
            luabind::class_<luaTest>("luaTest")    // < "Animation" how we want to name the Class in the Lua runtime
            .def(luabind::constructor<>())
            .def("TakeClass", amp;luaTest::TakeClass)
            .def("TakeObject", amp;luaTest::TakeObject)
         ];
    luabind::globals(L)["test"] = this;
  }
};


//#######################################################################
// Entiy Class
//#######################################################################

//#######################################################################
cEntity::cEntity()
{
  name = "NotSet";
  id = 0;
}


cEntity::~cEntity()
{
}

void cEntity::luabindClass(lua_State* L)
{
  luabind::module(L)
      [
          luabind::class_<cEntity>("cEntity")    // < "Animation" how we want to name the Class in the Lua runtime
          .def(luabind::constructor<>())            // < Binds the empty constructor
          .def_readwrite("name", amp;cEntity::name)
          .def_readwrite("id", amp;cEntity::id)
       ];
}


char const* script =
                 "entity = cEntity();n"
                 "entity.name = "Entity1";n"
                 "entity.id = 1;n"
                 "n"
                 "test:TakeClass(entity);n"
                 "test:TakeObject(entity);n";

int main() {
  lua_State* L = lua_open();
  luabind::open(L);

  cEntity::luabindClass(L);
  luaTest test;
  test.luabindClass(L);
  /* run the script */
  if (luaL_dostring(L, script)) {
    std::cout << lua_tostring(L, -1) << std::endl; // Print out the error message
  }
  lua_close(L);
}
  

Печатается:

 $ ccache clang   -lluabind -llua -g3 ~/test.cxx amp;amp; ./a.out
Entity1
Entity1
  

Так что, возможно, проблема в загрузке скрипта.
Напечатано ли какое-либо сообщение об ошибке?

(Извините, что я не могу ответить на этот вопрос в IRC. Потребовалось некоторое время, чтобы создать среду тестирования)

Комментарии:

1. При ответе кодом, пожалуйста, разместите его в code balise здесь. Почему? Потому что, если через X лет github не работает, тот, кто читает это, все равно может получить ответ 😉

2. Спасибо за быстрый ответ, извиняюсь за то, что не остался в irc, так как мне нужно было идти на работу (все еще хех) в распечатанном файле не было ошибок, я добавил проверку в takeClass и takeObject, а также в do_file, просто чтобы убедиться, существует ли конкретная версия lua /luabind я должен использовать? потому что я запустил ваш код и получил то же самое, что и раньше? Я знаю, что я использую lua5.1, я взял luabind с основного сайта?

3. @Saragan Я использую luabind, который можно установить с brew install luabind помощью (кажется, это 0.9.1). А версия lua — 5.1.5.

4. Хорошо, отключите lua и luabind и повторите попытку с этими версиями, это может быть просто несоответствие

5. хорошо, мы быстро загрузили двоичные файлы предварительной сборки lua 5.1.5 с sourceforge.net/projects/luabinaries/files/5.1.5 / … установил их в vc, а в sys32 / 64 собрана последняя версия библиотеки luabind 0.9.1, которая не вызвала ошибок при сборке (убедившись, что я установил правильный путь boost и lua_path (только двоичный файл загрузки)), и я все еще получаю ту же проблему? в настоящее время используется Visual studio 2012? я включил lua5.1.lib и luabindd. библиотека и включила каталог boost в качестве дополнительного