Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何返回C++;Cython中的包裹对象_Python_Cython - Fatal编程技术网

Python 如何返回C++;Cython中的包裹对象

Python 如何返回C++;Cython中的包裹对象,python,cython,Python,Cython,我是Cython的新手。我试图为下面的C++代码示例创建一个Python的Cython包装器。下面的例子只是一个模拟的例子,它说明了我在我的项目中所做的事情以及我遇到的问题 C++类 A.h B.h 在Cython: classes.pxd文件: cdef extern from "A.h": cdef cppclass A: A() except + B * newB() // Both classes in same .pxd file cdef ex

我是Cython的新手。我试图为下面的C++代码示例创建一个Python的Cython包装器。下面的例子只是一个模拟的例子,它说明了我在我的项目中所做的事情以及我遇到的问题

C++类

A.h

B.h

在Cython:

classes.pxd文件:

cdef extern from "A.h":
    cdef cppclass A:
        A() except +
        B * newB()
// Both classes in same .pxd file
cdef extern from "B.h":
classes.pyx文件:

cimport classes
from libcpp cimport bool

cdef class PyA:
    cdef classes.A *thisptr
    def __cinit__(self):
        self.thisptr = new classes.A()
    def newB(self):
        cdef PyB val = PyB()
        val.thisxptr = classes.newB()
        return val

cdef class PyB:
     cdef classes.B *thisxptr

     def __cinit__(self):
        self.thisxptr = NULL
     def __dealloc__(self):
        if self.thisxptr != NULL:
           del self.thisxptr
总之,类
B
应该通过类
A
中的
newB()
方法创建,主要是因为类
A
将需要类
B
的某些关键属性和资源。但我得到了以下错误:

无法将Python对象转换为“B*”


我想这只是几个打字错误。1) 您的
中的
if
是错误的。2)
val.thisxptr=self.thisptr.newB()
-正如您在中所写的那样,您没有找到合适的
a
来调用
newB
onOh是的,如果在dealoc中,则应该检查不为null。2)我现在得到的是:val.thisxptr=classes.thisptr.newB(),但这给出了文章中提到的错误。感谢
self
而不是
classes
(您需要像在Python中一样,将
self
添加为函数参数)<代码>类。此PTR
不存在。这个错误是没有帮助的,但它假设它可能能够在运行时找到具有该名称的Python函数(这将返回一个Python对象)。哦,是的,我也错过了。在不运行itI的情况下,从真实代码中模拟一个示例总是很困难的。我认为这只是几个输入错误。1) 您的
中的
if
是错误的。2)
val.thisxptr=self.thisptr.newB()
-正如您在中所写的那样,您没有找到合适的
a
来调用
newB
onOh是的,如果在dealoc中,则应该检查不为null。2)我现在得到的是:val.thisxptr=classes.thisptr.newB(),但这给出了文章中提到的错误。感谢
self
而不是
classes
(您需要像在Python中一样,将
self
添加为函数参数)<代码>类。此PTR
不存在。这个错误是没有帮助的,但它假设它可能能够在运行时找到具有该名称的Python函数(这将返回一个Python对象)。哦,是的,我也错过了。如果不运行实际代码,就很难从实际代码中模拟出一个示例
cdef extern from "A.h":
    cdef cppclass A:
        A() except +
        B * newB()
// Both classes in same .pxd file
cdef extern from "B.h":
cimport classes
from libcpp cimport bool

cdef class PyA:
    cdef classes.A *thisptr
    def __cinit__(self):
        self.thisptr = new classes.A()
    def newB(self):
        cdef PyB val = PyB()
        val.thisxptr = classes.newB()
        return val

cdef class PyB:
     cdef classes.B *thisxptr

     def __cinit__(self):
        self.thisxptr = NULL
     def __dealloc__(self):
        if self.thisxptr != NULL:
           del self.thisxptr