繁体   English   中英

无法从c ++ / lua函数调用成员函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM