[英]How do I pass one C++ class (reference) to another when using Cython?
我正在尝试使用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的一个基本问题-但在Google几个小时后,我似乎找不到任何解决方案。
任何帮助最欢迎。
谢谢!
指定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])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.