SWIG-Lua问题:如何返回一个类的另一个类。 SWIG-Lua是一个方便使用的工具,它允许将C/C++代码集成到Lua中。如果在C++代码中有一个类返回另一个类的实例,可以通过SWIG-Lua来实现这种功能。在SWIG-Lua中,可以使用SWIG_CollectSelf()函数来处理这种情况,该函数将调用Lua包装器中的__gc方法来删除返回的类的实例。 下面是一个例子: ```c++ class ClassA { public: ClassA(); ~ClassA(); ClassB& GetClassB(); private: ClassB* m_classB; }; class ClassB { public: ClassB(); ~ClassB(); private: int m_data; }; ``` 在SWIG接口文件中,需要将ClassB类作为另一个返回类型进行注册: ```c++ %module example %{ #include "example.hpp" %} %include "example.hpp" %{ // Register ClassB as a return type SWIG_Lua_add_class_type(SWIGTYPE_p_ClassB, "ClassB"); %} ``` 然后,在Lua代码中,使用ReturnNewObject()函数将ClassB实例返回给Lua: ```lua classA = example.ClassA() classB = classA:GetClassB() -- Return a new ClassB object to Lua return example.ReturnNewObject(classB) ``` 最后,添加__gc方法来处理返回的ClassB实例的删除: ```lua classB = example.ClassB() gc = getmetatable(classB).__gc setmetatable(classB, {__gc = function(self) gc(self) print("ClassB instance deleted!") end}) ``` 结果,当ClassB实例不再使用时,__gc方法将被调用,打印一条消息并删除实例。

我正在解决一个之前遇到的问题。

我有两个 C++ 类,我使用 SWIG 进行封装。一个类中的方法可以返回指向另一个类的指针。如何让 Lua 将其视为不仅仅是 userdata?

更具体地说:

我有以下类:

class fruit
{
     int numberofseeds;
  //some other stuff about fruit constructors etc...
   public:
     getseedcount()
     {
        return numberofseeds;
     }
}

class tree
{
    fruit * apple;
    public:
      //constructors and whatnot
    fruit * getfruit()
    {
         return apple;
    }

}

我使用 SWIG 封装了这两个类,以便可以在 Lua 中访问它们。

所以我可以在 Lua 中得到对象 _x=pomona.tree(grannysmith)_。

我现在的问题是:如何安排事情,以便当我键入 y=x:getfruit() 时,我将获得一个 pomona:fruit 类型的对象?那我就可 以写一些像 y:getseedcount() 这样的东西? 目前,我得到的所有内容都是不可食用的 userdata。

点赞
用户48940
用户48940

如果您的 SWIG .i 文件正确设置,您可以使用 ":" 操作符:

local y = x:getfruit()
local z = y:getseedcount()

请参阅 SWIG Lua documentation 的 "Classes" 部分(23.2.7)。

如果以上方法无法正常工作,您需要在您的 .i 文件中使用 typemap 告诉 SWIG 如何将 fruit* 输出参数转换为 Lua 表示。例如:

%typemap(out) fruit*
{
    swig_module_info* module = SWIG_GetModule(L);
    swig_type_info* typeInfo = SWIG_TypeQueryModule(module, module, "fruit *");

    SWIG_NewPointerObj(L, $1, typeInfo, 1);
}
2010-05-19 20:59:24