[英]Can't call member function from c++/lua function
我一直在尝试使用lua和c ++一段时间,并且所有“简单”功能都可以工作,即可以从lua调用c ++函数,反之亦然,但是我有一个主要问题。
它正在制作一个小型的游戏/模拟器,我想使用lua,ode并制作我自己的小界面(不是像LuaOde这样的直接界面)。 我的代码结构如下
main class //creates instances of Visual, Physics and LuaAddons
v = new Visual();
p = new Physics();
l = new LuaAddons();
现在我当然想和LuaAddons的物理学谈谈。 所以在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);
//Here I need to somehow talk to p (Physics())
return 0;
}
这样我就可以简单地在我的.lua文件中调用setWorldGravity(1, 2, 3)
,并通过正确的参数调用上面的函数。
这是问题所在。 在int setWorldGravity
里面,我想调用应用程序的物理部分并调用具有ODE调用的corrosponding函数来设置重力。
所以在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_
是由主要班级首次发起时创造的世界。
然而,由于int setWorldGravity(lua_State* L)
的int setWorldGravity(lua_State* L)
不是该类的成员(即未在LuaAddons.h中定义,如果它将不得不是静态的)我不能为我的生活弄清楚如何接近奇异的实例Physics(); 从函数本身。 显然,我不能让LuaAddons创建一个新的物理实例,因为它不会有相同的世界。
我试过的是:
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中创建一个新的调用者实例(mind boggles)来调用其成员:
la_ = LuaAddons()
la_:setWorldGravity(1, 2, 3)
但是这样,物理部分的链接就消失了,因为默认构造函数没有将指针传递给它。 一旦这个调用通过对象并到达它应用于ODE的部分,它就会崩溃(假设空指针或......指针错误:P)
如果我真的想要确保操作完全相同的物理世界,我会猜测我几乎被迫通过lua文件传递物理指针。 但我没有丝毫想法。
对于长时间阅读我感到很遗憾,但我宁愿彻底阅读,然后遗漏重要细节。
任何帮助/想法将非常感激。
在C ++中,成员函数本质上是具有隐藏参数的函数。 你写:
class Foo {
const int bar_;
public:
Foo(int b) : bar_ { }
int get_bar()
{
return bar_;
}
};
Foo f(5);
f.get_bar();
但是,实际上,你实际得到:
Foo f = Foo_constructor(5);
Foo_get_bar(f);
在C ++中,这个隐藏的参数称为this
指针(在Python中它是self
,其他语言有其他名称)。
听起来你想要的是一个类似C的函数,它将调用C ++成员函数,传递该隐藏参数。 最简单的解决方案是编写一个C函数,它接受成员函数所需的所有参数,以及一个额外的参数:调用函数的对象:
void setWorldGravityWrapper(Physics* p, int x, int y, int z)
{
return p->setWorldGravity(x, y, z);
}
还有其他技术(想到成员函数的指针),但这应该让你开始。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.