在一个名为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);
}


我需要一种不是主要课程的方式来做到这一点

最佳答案

您不能像这样注册成员函数。您的工作类似于C ++中的以下内容:

Test_Class::shoot_a_bullet(134);


例如,MSVC将其称为“非静态成员函数的非法调用”,这就是事实。

查看Luabind文档中的Binding classes to Lua部分,了解如何将类绑定到Lua。然后,您需要创建此类的对象并在其上调用函数,例如与Lua中的myobject:shoot_a_bullet(134):是将myobject作为第一个参数传递的语法糖)。

要查看该错误,您应该首先检查luaL_dostring的返回值。如果返回true,则呼叫失败。消息以字符串形式被推送到Lua堆栈中,可通过以下方式访问

lua_tostring(myLuaState, -1);


在这种情况下,它应该像

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


说明:当您将成员函数注册为自由函数时,luabind会在前面添加一个额外的引用参数,以便实际上在为其传递的参数对象上调用该方法。

关于c++ - luabind没有启动我为其定义的功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21178454/

10-11 23:10