无法从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

点赞
stackoverflow用户10593
stackoverflow用户10593

在 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);
}

还有其他技术(例如成员函数指针),但这应该可以让你开始了。

2011-01-20 09:37:31