我到过Google的尽头,然后再次尝试解决此问题。
我有一些从C++推送到Lua的userdata对象。
我有一个函数应该获取2D或3D对象的X值。
当我尝试获取userdata对象时,考虑到它可以是2D元素或3D对象,因此我需要能够为用户选择的X获取X。
这是我尝试过的:
int getX(lua_State* L)
{
Object3D* a = static_cast<Object3D*>(luaL_checkudata(L, 1, "Object3D"));
if (!a)
{
Object2D* b = static_cast<Object2D*>(luaL_checkudata(L, 1, "Object2D"));
if (b)
{
lua_pushnumber(L, b:getX());
}
else
{
lua_pushnil(L);
}
}
else
{
lua_pushnumber(L, a:getX());
}
return 1;
}
不幸的是,如果userdata类型不是Object3D,它将失败并因lua错误而退出,而不继续尝试Object2D。
因此,仅当所传递的对象为Object3D类型时,它才能在上述代码中起作用。
最佳答案
lua(L)_check*
函数在失败时引发Lua错误,lua(L)_to*
函数返回NULL
。无论出于何种原因,它都偏离了命名约定,而是被命名为lua(L)_test*
,这使得它很难找到。
您的代码不完整,无法按原样编译,因此我不愿意检查,但是,如果我没有记错的话,只需用luaL_checkudata
替换luaL_testudata
即可使其按预期工作。