函数需要抽象类型为A的C ++对象。如何将它传递给A子类的Lua对象?

时间:2009-04-29 18:57:15

标签: c++ lua binding

我想传递给一个函数,该函数期望纯虚拟类的C ++对象是从纯虚拟C ++类派生的类的Lua对象。我怎么能这样做?

我是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 ++:

... // somehow create an instance of MyA class and named myA
    // How? 
    // Maybe the result of a call to "MyA()"?

do_something(myA);

4 个答案:

答案 0 :(得分:2)

您必须创建一个实现纯虚函数的C ++类,然后调用Lua代码。实施太复杂了,不能在这里投入。

基本伪代码:

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

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

这个例子是非常高的水平,但它意味着要表明你想要做的事情是非平凡的。这是你希望实际暴露给你的Lua代码的新“LuaA”。

一般情况下,我喜欢在包装C ++以使用Lua和其他脚本语言时使用SWIG。 SWIG确实支持您感兴趣的虚拟方法的重载(在SWIG用语中称为“控制器”),但是,应该注意Lua / SWIG不支持控制器。 Java,C#,Ruby,Perl和Python都在SWIG中拥有导演支持。我不确定为什么Lua不支持它。

由于Lua不支持继承,因此您想要完成的内容的确切语义是不可能的。

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

答案 1 :(得分:2)

请参阅LuaBind文档中的10.1部分。您基本上为LuaBind类提供了一个简单的C ++包装器,它充当底层Lua实现的传递。请注意以下文档中的以下内容:

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

call(“f”,a)将调用Lua'f'函数,传入参数a。

答案 2 :(得分:2)

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

如果你是 new 到Lua,你应该认真考虑在原始Lua API 中编写你的第一个绑定,而不使用这种面向对象的布局。至少你会理解真正正在进行什么。

Lua API单独使用非常舒适。它不会产生任何额外的开销,您可以完全控制正在发生的事情。 Luabind图书馆的开发目前有点陈旧(但它看起来虽然恢复了生机)。

你应该考虑你是否 需要模仿Lua-side,特别是C ++方面的C ++类派生。对于Lua来说这样的事情并不那么自然,需要明显的开销才能实现。此外,在C ++中,您隐藏的事实是您正在对另一种语言进行非本地调用。除非有详细记录,否则这是性能问题的潜在来源。

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

答案 3 :(得分:1)

我将在C ++中继承纯虚拟类,然后可能从luabind开始(根据Aaron和lefticus的解决方案)。如果这个开销太大,我将只使用直接的Lua C堆栈 - twiddling API(按照亚历山大)。

因此,这里没有人回答。我稍后会发表评论结果。

谢谢大家!