使用 Cython 时如何将一个C++类(引用)传递给另一个类(引用)

How do I pass one C++ class (reference) to another when using Cython?

本文关键字:引用 C++ 另一个 一个 Cython 使用      更新时间:2023-10-16

我正在尝试使用Cython包装一个C++模块,以便我可以在Python中使用它。

该模块有多个类,其中一些类具有将对象引用到另一个类作为参数的方法。

因此,假设我有名为"foo"和"bar"的c ++类,并且cython将它们包装为:

cdef extern from "foobar.hpp" namespace "foobar":
    cdef cppclass foo:
        pass
    cdef cppclass bar:
        void kungFoo(foo &f)

现在我想创建一个包装类,以便我可以在 Python 中使用它......

cdef class pyFoo:
    cdef foo *thisptr
    def __cinit__(self):
        self.thisptr = new foo()
cdef class pyBar:
    cdef bar *thisptr
    def __cinit__(self):
        self.thisptr = new bar()
    def kungFoo(self, f):
        self.thisptr.kungFoo(f.thisptr)

这会导致"编译Cython文件时出错"和"无法将Python对象转换为'foo'"。

我认为这是因为cdef cppclass foo使foo成为与c ++类关联的"Python对象"。但是,当我需要将其作为参数传递给另一个 c++ 类时,这种巧妙的转换似乎并没有以另一种方式返回。

对我来说,这似乎是cython的一个基本问题 - 但是在谷歌上几个小时后,我似乎找不到任何解决方案。

任何帮助最受欢迎。

谢谢!

指定 f 参数的类型。所以把它变成这样:

def kungFoo(self, foo &f):
    self.thisptr.kungFoo(f)

或者这个:

def kungFoo(self, pyFoo f):
    self.thisptr.kungFoo(f.thisptr)

上述答案的第二部分代码应该可以工作,但您可能需要修改它,因为您是通过引用传递的。您可以修改为通过指针传递,无需进行任何修改,也可以导入取消引用 cython 模块以将指针转到对象并将对象分配给引用。

如何使用取消引用的示例显示在 Cython 和 c++ 类构造函数的答案中

希望这对您有所帮助。这个问题花了我很多小时来解决,上面的页面非常有帮助。

通过引用传递类:

    def kungFoo(self,pyFoo f):
         self.thisptr.kungFoo(f.thisptr[0])