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

use*_*710 5 c++ python python-2.x 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)
Run Code Online (Sandbox Code Playgroud)

现在我想创建一个包装类,以便我可以在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)
Run Code Online (Sandbox Code Playgroud)

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

我认为这是因为cdef cppclass foo使foo成为与c ++类关联的"Python对象".但是,当我需要将它作为参数传递给另一个c ++类时,这种聪明的转换似乎不会反过来.

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

欢迎任何帮助.

谢谢!

Cza*_*zak 2

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

def kungFoo(self, foo &f):
    self.thisptr.kungFoo(f)
Run Code Online (Sandbox Code Playgroud)

或这个:

def kungFoo(self, pyFoo f):
    self.thisptr.kungFoo(f.thisptr)
Run Code Online (Sandbox Code Playgroud)