繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM