luabind не запускал функцию, которую я для него определил

В классе Test_Class у меня есть функция:

shoot_a_bullet(int damage)  
{
    cout << "runned"; // i had #using namespace std
}

Я определил код следующим образом

luabind::module(myLuaState)[
    luabind::def("shoot_a_bullet", &Test_Class::shoot_a_bullet)
];

И следующий код не дал мне вывода на экран

luaL_dostring(myLuaState,"shoot_a_bullet(134)\n");

PS: я поставил cin.get() в конце, проблема не в этом.

редактировать: моя основная цель сделать это - позволить моим заскриптованным персонажам/врагам напрямую добавлять вещи в вектор, который содержит пули/эффекты/врагов и т. д.
Причина, по которой я не могу сделать функцию статической, заключается в том, что я нужен указатель основного этапа игры, чтобы он работал.

следующие коды работают нормально

void print_hello(int number) {
    cout << "hello world and : " << number << endl << "number from main : " << x << endl;
}

int x; //and the main with a global value

int main()
{
    cin >> x;
    lua_State *myLuaState = luaL_newstate();

luabind::open(myLuaState);

luabind::module(myLuaState)[
    luabind::def("print_hello", print_hello)
];

luaL_dostring(
    myLuaState,
    "print_hello(123)\n"
    );
cin.get();
cin.get();

lua_close(myLuaState);
}

Мне нужен способ сделать это в классе, который не является основным


person MadokaMagica    schedule 17.01.2014    source источник
comment
Функция shoot_a_bullet объявлена ​​в классе или снаружи?   -  person Caesar    schedule 17.01.2014
comment
попробуй распечатать ошибку. У вас может быть другая проблема   -  person Dmitry Ledentsov    schedule 17.01.2014
comment
@Dmitry Ledentsov ошибки нет   -  person MadokaMagica    schedule 17.01.2014
comment
@Mohammed Majeed: я действительно заявил, что внутри   -  person MadokaMagica    schedule 17.01.2014


Ответы (1)


Вы не можете зарегистрировать такие функции-члены. То, что вы делаете, похоже на следующее на С++:

Test_Class::shoot_a_bullet(134);

MSVC, например, называет это «незаконным вызовом нестатической функции-члена», и это именно то, что есть.

Посмотрите раздел Привязка классов к Lua в документацию Luabind о том, как связать класс с Lua. Затем вам нужно создать объект этого класса и вызвать для него функцию, например. с myobject:shoot_a_bullet(134) в Lua (: является синтаксическим сахаром для передачи myobject в качестве первого аргумента).

Чтобы увидеть ошибку, сначала проверьте возвращаемое значение luaL_dostring. Если он возвращает true, вызов не удался. Сообщение помещается в стек Lua как строка, доступная с помощью

lua_tostring(myLuaState, -1);

В этом случае должно быть что-то вроде

No matching overload found, candidates:
void shoot_a_bullet(Test_Class&)

Объяснение: Когда вы регистрируете функцию-член как свободную, luabind добавляет перед ней дополнительный ссылочный параметр, так что метод фактически вызывается для переданного для него объекта-аргумента.

person Oberon    schedule 17.01.2014
comment
нужно убедиться, что автор не сделал член статическим - person Dmitry Ledentsov; 17.01.2014
comment
Теперь кое-что беспокоит меня еще больше, потому что он вернул true, а вывода все еще нет. - person MadokaMagica; 17.01.2014
comment
true означает, что произошла ошибка (тогда как false означает успех). Это немного нелогично. См. lua.org/manual/5.2/manual.html#luaL_dostring. - person Oberon; 17.01.2014