2017-03-02 4 views
0

cythonでポインタを扱うときに問題があります。クラスのcython実装は、クラスPersonのC++インスタンスへのポインタを保持します。CythonでC++クラスをラップするときのポインタの処理

person.pyx

cdef class PyPerson: 
    cdef Person *pointer 

    def __cinit__(self): 
     self.pointer=new Person() 

    def set_parent(self, PyPerson father): 
     cdef Person new_father=*(father.pointer) 
     self.c_person.setParent(new_father)   

引数としてPersonオブジェクトを受け取りsetParent C++方法:ここに私の.pyxファイルです。 PyPersonクラスの属性pointerPersonオブジェクトへのポインタであるため、*pointerというアドレスのオブジェクトを*(PyPersonObject.pointer)という形で取得できたと考えました。私はそれをコンパイルしようとすると、しかし、私は

def set_parent(self, PyPerson father): 
    cdef Person new_father=*(father.pointer) 
          ^
------------------------------------------------------------ 

person.pyx:51:30: Cannot assign type 'Person *' to 'Person' 

次のエラーを取得する誰かが、私はポインタのアドレスで、オブジェクトに得ることができる方法を知っていますか? 私がC++プログラムで同じことをしても、エラーは発生しません。ここではC++クラスの実装は、あなたがそれを見たい場合には:

person.cpp

Person::Person():parent(NULL){ 
} 

Person::setParent(Person &p){ 
    parent=&p; 
} 

注:私は他の理由Personインスタンス(cdef Peron not_pointer)を保持することによってそれを解決することはできません完全なクラスを含む。

答えて

1

私はcythonでC++を使ってcythonのドキュメントを完全に読んでいたはずです。参照解除演算子*がcythonで使用できない場合は、cython.operatorモジュールからdereferenceをインポートする必要があります。あなたが指し示す住所のオブジェクトにアクセスしたいときはdereference(pointer)と書くべきです。

具体的には、私の問題に対する答えはcdef Person new_father=dereference(father.c_person)と書いてください。

関連する問題