2024-05-13 20:42:08 发布
网友
cimport cppClassA cdef class A: cdef cppClassA.A *ptr ... def foo(): return self.ptr.foo()
这样,我返回了直接C++类B,但是我想返回一个PYB。因此,我需要创建一个PyB对象,但是如何构造PyB的cinit()方法呢?如何从self.ptr.foo()返回一个新的PyB对象并返回它?在
从您的问题中不完全清楚foo是否通过指针或值返回(即它是否具有签名B* foo()还是B foo())。你要做什么取决于这个-我已经展示了两者。在
foo
B* foo()
B foo()
我认为你遇到的问题是^ {{CD4>}或^ {CD5>}方法的^ {< CD6>}只能以Python对象作为参数,所以你无法通过C++ ^ ^ {CD7>}对象。解决方案是创建一个空的或{“C++”对象为^ {CD9}}的^ {< CD6}},然后替换它。在
cdef extern from "somefile.hpp": cdef cppclass A: B foo1() B* foo2() cdef cppclass B: # only need to provide these for foo1_alternative B() B(const B&)
注意,我提供了两个版本的foo-foo1,它按值返回,而{}返回指针。在
foo1
Python B持有者(PyB)看起来像
B
PyB
我提供了一个可选的make_ptr参数,您可以将其设置为False,以避免将self.ptr设置为任何值。在
make_ptr
False
self.ptr
Python的A持有者(PyA)是
A
PyA
cdef class PyA: cdef A* ptr # code goes here def foo1(self): cdef PyB val = PyB() val.ptr[0] = self.ptr.foo1() # use move (or copy) assignment operator def foo1_alternative(self): cdef PyB val = PyB(make_ptr=False) val.ptr = new B(self.ptr.foo1()) # use move (or copy) constructor def foo2(self): cdef PyB val = PyB(make_ptr=False) val.ptr = self.ptr.foo2()
对于返回指针的foo2,只需创建一个空的PyB,并将返回的Foo*分配给self.ptr。对于foo1您有两个选项,其中一个选项涉及创建一个PyB,然后使用move(或copy)赋值运算符复制数据。第二个选项涉及创建一个空的PyB,然后使用B的move(或copy)构造函数创建一个B*。在
foo2
Foo*
B*
从您的问题中不完全清楚
foo
是否通过指针或值返回(即它是否具有签名B* foo()
还是B foo()
)。你要做什么取决于这个-我已经展示了两者。在我认为你遇到的问题是^ {{CD4>}或^ {CD5>}方法的^ {< CD6>}只能以Python对象作为参数,所以你无法通过C++ ^ ^ {CD7>}对象。解决方案是创建一个空的或{“C++”对象为^ {CD9}}的^ {< CD6}},然后替换它。在
< C++代码的包装看起来像这个注意,我提供了两个版本的}返回指针。在
foo
-foo1
,它按值返回,而{Python
^{pr2}$B
持有者(PyB
)看起来像我提供了一个可选的
make_ptr
参数,您可以将其设置为False
,以避免将self.ptr
设置为任何值。在Python的
A
持有者(PyA
)是对于返回指针的
<>你最好使用移动构造函数,而不是复制构造函数,但是你不需要告诉Cython,(C++会自动选择正确的)。在foo2
,只需创建一个空的PyB
,并将返回的Foo*
分配给self.ptr
。对于foo1
您有两个选项,其中一个选项涉及创建一个PyB
,然后使用move(或copy)赋值运算符复制数据。第二个选项涉及创建一个空的PyB
,然后使用B
的move(或copy)构造函数创建一个B*
。在相关问题 更多 >
编程相关推荐