一个函数期望一个抽象类型 A 的 C++ 对象。我如何传递一个 A 的子类的 Lua 对象给它?

我想向一个接收纯虚类的 C++ 对象的函数传递一个 Lua 对象,该 Lua 对象派生自纯虚 C++ 类。我该如何做到这一点?

由于我是新手,对 Lua 和 luabind 有一些不熟悉,请多多包涵。

在 C++ 中:

struct A {
  virtual void foo() = 0;
};

void do_something(A* a) {
  a->foo();
}

在 Lua 中:

class 'MyA' (A)
....
function MyA:foo()
  print('hi')
end

再次在 C++ 中:

... // 使用某种方式创建一个 MyA 类的实例并命名为 myA
    // 如何?
    // 也许是调用 "MyA()" 的结果?

do_something(myA);

原文链接 https://stackoverflow.com/questions/803748

点赞
stackoverflow用户29975
stackoverflow用户29975

你需要创建一个 C++ 类,实现你的纯虚函数,然后调用 Lua 代码。实现代码比较复杂,难以在此处一一列举。

基本的伪代码如下:

// C++
struct LuaA : public A
{
  LuaA(const std::string &luacode)
    : myLuaHandler(luacode)
  {
  }

  virtual void foo()
  {
    myLuaHandler.call("MyA:foo()");
  }
}

该示例非常高级,但旨在展示您想要做的非常复杂。新的 "LuaA" 才是您实际想要向 Lua 代码公开的。

一般情况下,我更喜欢使用 SWIG 将我的 C++ 包装为可供 Lua 和其他脚本语言使用。SWIG 支持您感兴趣的这种虚函数重载(在 SWIG 术语中称为 "directors"),但应注意的是,Lua/SWIG 不支持 directors。Java、C#、Ruby、Perl 和 Python 在 SWIG 中都支持 directors。我不确定为什么 Lua 不支持 directors。

可能是因为 Lua 不支持继承,在提出的方案中无法实现您想要完成的确切语义。

也许有其他人对 Lua 方面有更好的答案?

2009-04-29 21:14:01
stackoverflow用户48940
stackoverflow用户48940

请参阅 LuaBind 文档中的 10.1 章节。你需要提供一个简单的 C++ 包装器来调用 LuaBind 类,这个包装器作为底层 Lua 实现的通道。请注意以下示例:

virtual void f(int a)
{
    call<void>("f", a);
}

调用 call("f", a) 将会调用 Lua 中的 f 函数,并将参数 a 传递给它。

2009-04-29 21:39:21
stackoverflow用户6236
stackoverflow用户6236

对不起,我不会直接回答你的问题,但是会从个人经验中提供一些建议:

如果你是_Lua_新手,应该认真考虑使用原始Lua API编写你的第一个绑定,而不是使用面向对象的布局。至少你会明白发生了什么。

Lua API本身非常舒适。它不会创建任何额外开销,你完全可以控制什么正在发生。目前Luabind库的开发有点停滞(但它似乎又活跃起来了)。

你应该考虑是否_真的_需要在Lua端模仿从C++类派生的对象,尤其是在C++端。这种事对Lua来说并不是很自然,需要实现明显的开销。此外,在C++中,你隐藏了事实,即你正在对另一种语言进行非本地调用。除非有充分的文档,否则这可能是性能问题的潜在来源。

当几年前我开始使用Lua时,我也像你一样使用Luabind编写绑定,并模仿从C++对象派生。现在我使用纯Lua API和简单的过程式跨语言接口(与面向对象相对)。我对结果非常满意。

2009-04-30 05:57:39
stackoverflow用户28287
stackoverflow用户28287

我将在 C++ 中创建纯虚拟类的子类,然后可能会开始使用 luabind(根据 Aaron 和 lefticus 的解决方案)。如果这太过耗费时间,我将只使用直接的Lua C堆栈操作API(根据Alexander的建议)。

因此,这里没有一个正确答案。我会稍后发布带有结果的评论。

谢谢大家!

2009-04-30 16:08:54