我正在尝试包装两个 C++ 类:Cluster 和 ClusterTree。ClusterTree 有一个方法 get_current_cluster() 实例化一个 Cluster 对象,并返回一个对它的引用。ClusterTree 拥有 Cluster 对象,并在 C++ 中管理它的创建和删除。
我已经用 cython 包裹了 Cluster,从而产生了 PyCluster。
PyCluster 应该有两种创建方式:
1) 通过传入两个数组,这意味着 Python 应该自动处理删除(通过 __dealloc__)
2) 通过直接传入原始 C++ 指针(由 ClusterTree 的 get_current_cluster() 创建)。在这种情况下,ClusterTree 然后承担删除底层指针的责任。
从 libcpp cimport 布尔
从 libcpp.vector cimport 向量
cdef extern 来自 "../include/Cluster.h" 命名空间 "Terran":
cdef cppclass 集群:
簇(向量[向量[双]],向量[整数])除了+
cdef 类 PyCluster:
cdef 集群* __thisptr
__autoDelete = 真
def __cinit__(self, vector[vector[double]] data, vector[int] period):
self.__thisptr = 新集群(数据,周期)
@classmethod
def __constructFromRawPointer(self, raw_ptr):
self.__thisptr = raw_ptr
self.__autoDelete = False
def __dealloc__(self):
如果自我.__autoDelete:
德尔自我.__thisptr
cdef extern 来自 "../include/ClusterTree.h" 命名空间 "Terran":
cdef cppclass ClusterTree:
ClusterTree(vector[vector[double]],vector[int]) 除了 +
集群&getCurrentCluster()
cdef 类 PyClusterTree:
cdef ClusterTree *__thisptr
def __cinit__(self, vector[vector[double]] data, vector[int] period):
self.__thisptr = new ClusterTree(data,period)
def __dealloc__(self):
德尔自我.__thisptr
def get_current_cluster(self):
cdef Cluster* ptr = &(self.__thisptr.getCurrentCluster())
返回 PyCluster.__constructFromRawPointer(ptr)
这导致:
编译 Cython 文件时出错:
-------------------------------------------------- ----------
...
def get_current_cluster(self):
cdef Cluster* ptr = &(self.__thisptr.getCurrentCluster())
返回 PyCluster.__constructFromRawPointer(ptr)
^
-------------------------------------------------- ----------
terran.pyx:111:54:无法将“集群 *”转换为 Python 对象
注意我不能 cdef __init__ 或 @classmethods。