C++ 如何设置一个元表以从另一个元表继承,同时将userdata更改为另一种类型?
我正试图找出一种好方法,使userdata从基本userdata对象派生 我希望能够做到这一点:C++ 如何设置一个元表以从另一个元表继承,同时将userdata更改为另一种类型?,c++,inheritance,struct,lua,lua-userdata,C++,Inheritance,Struct,Lua,Lua Userdata,我正试图找出一种好方法,使userdata从基本userdata对象派生 我希望能够做到这一点: local item = me:GetCurrentItem() print(item:GetPos()) 而不是: local item = me:GetCurrentItem() print(item:GetBaseObject():GetPos()) 在这些示例中,me:GetCurrentItem()使用一些函数返回userdata,但它缺少item:GetBaseObject()返回的
local item = me:GetCurrentItem()
print(item:GetPos())
而不是:
local item = me:GetCurrentItem()
print(item:GetBaseObject():GetPos())
在这些示例中,me:GetCurrentItem()使用一些函数返回userdata,但它缺少item:GetBaseObject()返回的基函数
我将Lua绑定到Crysis Wars SDK中用于学习目的。SDK提供了一个到基本实体(结构)的接口。IItem结构(me:GetCurrentItem())是相同的。
因为这些都是结构,所以我无法将它们转换为基本结构或调用其基本函数。我必须使用IEntity*GetEntity()函数
我尝试在_索引中更改自指针,但它会导致局部变量“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')
我还没有测试过这些函数,所以要小心bug。它们应该同时使用“获取的属性”(
self:GetSomething()
以及简单访问self.something
)。代码假定您将始终使用“:”来调用委托方法,因此在需要时添加self
如果没有好办法,我想这样做。在所有类中再次添加相同的函数将是一项非常重复的任务,因为基本实体有许多函数我将要使用。也许我只需要意识到这是正确的方法。@CapsAdmin重复代码从来都不是一件好事。我已经添加了一些代码,可以让您以更干净的方式做您想做的事情。如果你有任何问题,请告诉我。我想在C++中做这件事,但是在Lua做它似乎并不是一个坏主意。我建议从LUA实现开始,如果后来它被识别为瓶颈,那么用C++实现它。不过,很可能不需要这样做。另外,谢谢你接受我的回答!