Сбой функции Lua при сравнении хранимых указателей объектов C ++ с использованием Luabind

Я только начинаю с Luabind и C ++. Моя цель довольно проста:

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

Вот полный код:

extern "C" {
#include "lua.h"#include "lualib.h"}
#include <luabind/luabind.hpp>

class Obj {
};

int main(int argc, char **argv) {
lua_State* cLuaState = luaL_newstate();
luabind::open(cLuaState);
luaL_openlibs(cLuaState);

luabind::module(cLuaState) [
luabind::class_<Obj>("Obj")
];

luaL_dostring(cLuaState, "\
function func(v)\n\
print (\"Before: x is same as v?\")\n\
print (x == v)\n\
x = v\n\
print (\"After: x is same as v?\")\n\
print (x == v)\n\
end");

Obj* o = new Obj();
try {
luabind::call_function<void>(cLuaState, "func", o);
luabind::call_function<void>(cLuaState, "func", o);
} catch (std::exception &e) {
std::cout << "Exception thrown: " << e.what() << std::endl;
return 1;
}
return 0;
}

Когда я запускаю эту программу, я ожидаю увидеть следующий вывод:

Before: x is same as v?
false
Setting v
After: x is same as v?
true
Before: x is same as v?
true
Setting v
After: x is same as v?
true

Однако, когда я запускаю программу, она падает во время второго вызова функции Lua во время сравнения между «x» и «v». Это фактический результат программы:

Before: x is same as v?
false
Setting v
After: x is same as v?
true
Before: x is same as v?
Exception thrown: lua runtime error
*** Exited with return code: 1 ***

Как видно, сравнение работает во время первого вызова функции как до, так и после установки ‘v’. Однако первое сравнение не выполняется во время второй вызываемой функции.

Я, должно быть, упускаю что-то невероятно очевидное, но я действительно не могу понять, что это такое. Кто-нибудь может увидеть, что я делаю не так? Любой совет высоко ценится!

Большое спасибо,
Мартин

2

Решение

Я нашел решение. Похоже, по какой-то причине Lua хочет использовать перегруженный оператор равенства C ++ для сравнения двух объектов, а не для сравнения самих указателей. Создав перегруженный оператор равенства, который просто сравнивает адреса двух объектов и привязывает его к Lua, я могу заставить его работать.

Я до сих пор не уверен, почему Lua будет выполнять сравнение таким образом только при втором вызове функции, а не при первом, но, по крайней мере, теперь у меня есть работоспособное решение.

Полная измененная рабочая версия ниже:

extern "C" {
#include "lua.h"#include "lualib.h"}
#include <luabind/luabind.hpp>
#include <luabind/operator.hpp>

class Obj {
};

bool operator==(const Obj& a, const Obj& b) {
return &a == &b;
}

int main(int argc, char **argv) {
lua_State* cLuaState = luaL_newstate();
luabind::open(cLuaState);
luaL_openlibs(cLuaState);

luabind::module(cLuaState) [
luabind::class_<Obj>("Obj")
.def(luabind::const_self == luabind::const_self)
];

luaL_dostring(cLuaState, "\
function func(v)\n\
print (\"Before: x is same as v?\")\n\
print (x == v)\n\
x = v\n\
print (\"After: x is same as v?\")\n\
print (x == v)\n\
end");

Obj* o = new Obj();
try {
luabind::call_function<void>(cLuaState, "func", o);
luabind::call_function<void>(cLuaState, "func", o);
} catch (std::exception &e) {
std::cout << "Exception thrown: " << e.what() << std::endl;
return 1;
}
return 0;
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]