我到过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即可使其按预期工作。

09-07 08:26