我正在尝试包装两个 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。