gpt4 book ai didi

c++ - luabind 没有启动我定义的功能

转载 作者:行者123 更新时间:2023-11-28 02:59:33 25 4
gpt4 key购买 nike

在一个名为 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()放在了最后,这不是问题。

编辑: 我这样做的主要目的是让我的脚本化角色/敌人能够直接向包含子弹/效果/敌人等的 vector 添加内容。
我不能使函数静态的原因是因为我需要主游戏阶段的指针才能让它工作。

下面的代码可以正常工作

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 称其为“非法调用非静态成员函数”,而这正是事实。

查看 Binding classes to Lua 部分在 Luabind 文档中了解如何将类绑定(bind)到 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com