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

时间:2014-01-08 14:55:50

标签: python c++ cython python-2.x

我正在尝试使用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上几个小时后我似乎无法找到任何解决方案。

欢迎任何帮助。

谢谢!

3 个答案:

答案 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])