Cluster と ClusterTree の 2 つの C++ クラスをラップしようとしています。ClusterTree には、Cluster オブジェクトをインスタンス化し、その参照を返すメソッド get_current_cluster() があります。ClusterTree は Cluster オブジェクトを所有し、C++ でその作成と削除を管理します。
Cluster を cython でラップして、PyCluster を作成しました。
PyCluster には、次の 2 つの作成方法が必要です。
1) 2 つの配列を渡す。これは、Python が削除を自動的に処理する必要があることを意味します (__dealloc__ を使用)
。 2) 生の C++ ポインター (ClusterTree の get_current_cluster() によって作成) を直接渡す。この場合、ClusterTree は基になるポインターを削除する責任を負います。
libcpp cimport bool から libcpp.vector から cimport vector "../include/Cluster.h" 名前空間 "Terran" からの cdef extern: cdef cppclass クラスター: Cluster(vector[vector[double]],vector[int]) + 以外 cdef クラス PyCluster: cdef クラスター* __thisptr __autoDelete = True def __cinit__(self, vector[vector[double]] data, vector[int] period): self.__thisptr = 新しいクラスター (データ、期間) @クラスメソッド def __constructFromRawPointer(self, raw_ptr): self.__thisptr = raw_ptr self.__autoDelete = False def __dealloc__(self): self.__autoDelete の場合: del self.__thisptr "../include/ClusterTree.h" 名前空間 "Terran" からの cdef extern: 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 = 新しい ClusterTree(データ、期間) def __dealloc__(self): del self.__thisptr def get_current_cluster(self): cdef Cluster* ptr = &(self.__thisptr.getCurrentCluster()) return PyCluster.__constructFromRawPointer(ptr)
これにより、次の結果が得られます。
Cython ファイルのコンパイル エラー: -------------------------------------------------- ---------- ... def get_current_cluster(self): cdef Cluster* ptr = &(self.__thisptr.getCurrentCluster()) return PyCluster.__constructFromRawPointer(ptr) ^ -------------------------------------------------- ---------- terran.pyx:111:54: 'Cluster *' を Python オブジェクトに変換できません
__init__ または @classmethods を cdef できないことに注意してください。