c++ - 如何设置一个元表以从另一个元表继承,同时将用户数据更改为另一种类型?

标签 c++ inheritance struct lua lua-userdata

这是我想在 C++ 中使用 Lua C API 做的事情。

我正在尝试找出一种使用户数据派生自基本用户数据对象的好方法。

我希望能够做到这一点:

local item = me:GetCurrentItem()
print(item:GetPos())

代替:

local item = me:GetCurrentItem()
print(item:GetBaseObject():GetPos())

在这些示例中,me:GetCurrentItem() 返回带有某些函数的用户数据,但它缺少 item:GetBaseObject() 返回的基本函数。

出于学习目的,我在 Crysis Wars SDK 中绑定(bind)了 Lua。 SDK 为作为结构的基本实体提供接口(interface)。 IItem 结构 (me:GetCurrentItem()) 是相同的。 由于这些是结构,我无法将它们转换为基本结构或调用其基本函数。我必须使用 IEntity *GetEntity() 函数。

我试过改变 __index 中的自指针,但它导致局部变量“item”变成“entity”,这很明显,但我希望它在调用 GetPos 函数后恢复原状,这似乎不合逻辑。

有没有人有解决这个问题的好方法?

最佳答案

显而易见的解决方案是定义一个执行重定向的 item:GetPos() 函数。

function Item:GetPos()
  return self:GetBaseObject():GetPos()
end

其中 Item 是项目的元表。

这与在元表上进行更改一样有效,而且问题较少。

编辑:我也可以帮你解决重复问题。

您可以实现以下两个功能:

function delegate(klass, methodName, memberName)
  klass[methodName] = function(self, ...)
    local member = self[memberName]
    if type(member) == 'function' then member = self[memberName](self) end
    return member[methodName](member, ...)
  end
end

然后像这样使用它:

delegate(Item, 'GetPos', 'GetBaseObject')

该单行与上面的 Item:GetPos 3 行定义相同。

如果你需要多次重复这个,你可以用这个其他函数进一步优化它:

function delegateMany(klass, methodNames, memberName)
  for _,methodName in ipairs(methodNames) do
    delegateMethod(klass, methodName, memberName)
  end
end

这应该允许你做:

deletageMany(Item, {'GetPost', 'SetPos', 'GetColor', 'SetColor'}, 'GetBaseObject')

我还没有测试过这些功能中的任何一个,所以要小心错误。他们应该同时使用“获得的属性”(self:GetSomething() 以及简单的访问 self.something)。该代码假定您将始终使用“:”来调用委托(delegate)方法,因此在需要时添加了 self

关于c++ - 如何设置一个元表以从另一个元表继承,同时将用户数据更改为另一种类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6605815/

相关文章:

c++ - 编译简单的 hello world 程序时错误泛滥

c++ - float 只打印整数部分

c++ - 多线程策略? (通过Editor在多线程引擎中修改场景)

c++ - Qt:将 native 操作系统特定代码添加到项目

Java 程序创建 Person 类时出错

c++ - 虚方法,operator=(), operator<<();

python - super 不使用类装饰器?

c - 错误 : expected ‘;’ , 标识符或 ‘(’ 之前的 ‘struct’

c - 技巧 C 编译器将整个结构分配给零,没有 for 循环

go - 了解结构嵌入