【发布时间】:2019-01-03 12:01:28
【问题描述】:
我使用 SWIG 绑定 C++ 类,以便在 Lua 中使用它们。
不知道是否可以在Lua中处理C++类的构造失败。
例如,我有以下Test 类,它在构造时尝试获取用户数据。
void *getUserdata(lua_State *L, const char *key)
{
lua_pushstring(L, key);
lua_gettable(L, LUA_REGISTRYINDEX);
return lua_touserdata(L, -1);
}
class Test
{
public:
Test(lua_State *L)
:data(static_cast<MyData *>(getUserdata(L, "my_name"))){};
void setDataNum(int num)
{
data->num = num;
}
private:
MyData *data;
};
但是,如果 getUserdata() 返回 nullptr,则调用 setDataNum() 会使我的应用程序崩溃。
我想知道是否有任何方法可以检测和处理构造失败(在这种情况下data 变为nullptr),因此类不会在 Lua 中创建。
【问题讨论】:
-
您能否创建一个 lua 类,让您在调用
getUserdata创建的类之前检查您首先从 lua 调用的 userData 的状态? -
您说您正在使用 SWIG,但您正在直接操作 Lua 堆栈,并且您发布的示例不是 SWIG 接口文件。对我来说,不清楚你在问什么。
-
@HenriMenke 对不起,我的 SWIG 接口文件中有这段代码:
%typemap(default) (lua_State *L) { $1 = L; }这就是它可以直接操作 Lua 堆栈的方式。也许我应该为Test类创建一个类型映射来处理异常? -
既然可以将它们保存为
Test的私有成员,为什么还要将它们保存为用户数据?"my_name"的用户数据中有什么?你有点违背了 SWIG 的目的,即在 C++ 和脚本语言之间给你一个清晰的界限。 -
@cuinjune 我明白了。我也没有像现在那样支持你的问题,这应该会让你超过 15 个代表。
标签: c++ class constructor lua swig