Cython中重载解引用运算符获取PPho内部shared_ptr指向的Pho对象
问题原因
报错的核心是get()是std::shared_ptr的成员方法,而你调用的对象是PPho类型,本身没有实现get()方法;同时PPho的PhoPtr是私有成员,你在Cython的pxd文件里声明私有成员也无法正常访问。
你可以直接用PPho已经公开的重载运算符实现需求,两种可行方案如下:
第一步:修正pxd头文件声明
首先删除pxd中私有成员PhoPtr的声明,修正重载运算符的声明格式:
from libcpp.memory cimport shared_ptr, weak_ptr cdef cppclass Pho: Pho() Pho(Pho &Other) cdef cppclass PPho: PPho() except + PPho(const PPho &Other) PPho(const shared_ptr[Pho] &Other) PPho(std::nullptr_t) # 修正->运算符声明 Pho* operator->() const # 声明类型转换运算符 operator shared_ptr[Pho]() const operator weak_ptr[Pho]() const operator bool() const void Reset()
第二步:pyx实现文件修改,二选一即可
方案1:直接用重载的->运算符获取Pho指针
PPho已经实现了operator->直接返回Pho*,不需要绕路拿shared_ptr:
cdef class PyPPho: cdef PPho* device def __cinit__(self): self.device = NULL cdef assign_device(self, PPho& device_): self.device = &device_ cdef get_pho(self): # 解引用得到PPho对象后直接调用重载的->运算符 return (*self.device).operator->()
方案2:通过类型转换拿到shared_ptr再获取Pho指针
如果你需要同时拿到shared_ptr<Pho>对象本身,可以用PPho提供的类型转换运算符:
cdef get_pho(self): cdef shared_ptr[Pho] sp_ptr = <shared_ptr[Pho]>(*self.device) return sp_ptr.get()
注意事项
- 如果需要把返回的
Pho*封装为Python可访问的对象,需要额外实现对应PyPho包装类,将指针绑定到包装类实例,且注意不要让Pho*的生命周期超过持有它的PPho对象,避免野指针。
内容的提问来源于stack exchange,提问作者Rodolfo
相关产品推荐
相关产品推荐

