无法从C++/Lua函数调用成员函数。
我一直在尝试使用lua和c++来制作一个小小的游戏/模拟器,所有“简单”的功能都有效,即可以从lua调用c++函数,也可以反向调用,但我有一个主要问题。
我想要使用lua、ode制作自己的小型接口(不是直接使用LuaOde)。
我的代码结构如下:
主类 //创建Visual、Physics和LuaAddons实例
v = new Visual();
p = new Physics();
l = new LuaAddons();
现在我当然希望从LuaAddons中访问Physics。
因此在LuaAddons.cpp中,我有:
int setWorldGravity(lua_State* L){
float x = luaL_checknumber(L, 1);
float y = luaL_checknumber(L, 2);
float z = luaL_checknumber(L, 3);
//我需要以某种方式与p(Physics())通信
return 0;
}
这样,我只需在我的.lua文件中调用setWorldGravity(1、2、3)
,上述函数就会按照传递的正确参数进行调用。
然而,问题就在这里。在int setWorldGravity
内,我想要调用应用程序的物理部分并调用具有ODE调用以设置重力的相应函数。
因此在Physics.h中,我有:
void setWorldGravity(float x, float y, float z);
这将使用那些参数调用正确的ODE函数:
void Physics::setWorldGravity( float x, float y, float z ){
dWorldSetGravity (world_, x, y, z);
}
其中world_
是在主类创建时首次启动的世界。
但由于在LuaAddons中的int setWorldGravity(lua_State* L)
不是该类的成员(即未在LuaAddons.h中定义,如果是则必须为static),我一直无法想象如何从函数本身访问单个实例的Physics()。显然,我不能让LuaAddons创建Physics的新实例,因为这将没有相同的世界。
我尝试过的方法是:
l = new LuaAddons(p);
其中(在LuaAddons.h中)
LuaAddons(Physics* p);
和(在LuaAddons.cpp中)
LuaAddons(Physics* p){
phys_ = p; // where phys_ is a private member of LuaAddons.h
}
但是当我尝试添加
phys_->setWorldGravity(x, y, z); // error C2065: 'phys_' : undeclared identifier
它不起作用,因为(大惊小怪)该函数不知道phys_。
我还尝试使用Lunar.h库。通过这个库,我可以将lua函数重塑为一个成员函数,将它声明在.h中,并实际调用phys_→stuff。然而,该库也强制您在.lua中创建调用其成员的调用者的新实例(脑袋发晕):
la_ = LuaAddons()
la_:setWorldGravity(1, 2, 3)
然而,这样链接到Physics的部分就消失了,因为默认构造函数没有得到指针的传递。当这个调用通过对象并到达应用于ODE的部分时,它会简单地崩溃(假设空指针或…一些指针错误:P)
我猜测,如果我真的想确保在操作相同的物理世界,则几乎被迫在lua文件中传递物理指针。但是,我一点也不知道该如何操作。
很抱歉读起来很长,但我宁愿详细而非遗漏重要细节。
任何帮助/想法都将非常感激。
原文链接 https://stackoverflow.com/questions/4742264
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
在 C++ 中,成员函数本质上是带有隐藏参数的函数。你可以这样写:
class Foo { const int bar_; public: Foo(int b) : bar_ { } int get_bar() { return bar_; } }; Foo f(5); f.get_bar();
但实际上,你得到的是:
在 C++ 中,这个隐藏参数被称为
this
指针(在 Python 中是self
,其他语言有其他名称)。听起来你想要的是一个类似 C 的函数,可以调用 C++ 成员函数并传递该隐藏参数。最简单的解决方案是编写一个 C 函数,它接受所有成员函数接受的参数以及一个额外的参数:要调用函数的对象:
void setWorldGravityWrapper(Physics* p, int x, int y, int z) { return p->setWorldGravity(x, y, z); }
还有其他技术(例如成员函数指针),但这应该可以让你开始了。