我正在尝试使用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上几个小时后我似乎无法找到任何解决方案。
欢迎任何帮助。
谢谢!
答案 0 :(得分:2)
指定f参数的类型。所以说吧:
def kungFoo(self, foo &f):
self.thisptr.kungFoo(f)
或者这个:
def kungFoo(self, pyFoo f):
self.thisptr.kungFoo(f.thisptr)
答案 1 :(得分:0)
上述答案的第二部分代码应该有效,但您可能需要修改它,因为您通过引用传递。您可以修改以传递指针,其中不需要进行任何修改,或者您可以导入取消引用cython模块以将指针转向对象并将对象分配给引用。
Cython and c++ class constructors
的答案中显示了如何使用取消引用的示例希望这会对你有所帮助。这个问题花了我很多时间来解决,上面的页面非常有帮助。
答案 2 :(得分:0)
通过引用传递类:
def kungFoo(self,pyFoo f):
self.thisptr.kungFoo(f.thisptr[0])