#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 в качестве дополнительного