使用 Cython 包装 C++ 类时处理指针

ben*_*ngo 6 c++ python pointers cython

使用 cython 处理指针时遇到问题。该类的 cython 实现持有一个指向 class 的 C++ 实例的指针Person。这是我的.pyx文件:

人.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)        
Run Code Online (Sandbox Code Playgroud)

C++ 方法setParentPerson对象作为参数。由于属性pointer的的PyPerson类是指向一个Person对象,我认为我可以在由指向的ADRESS获取对象*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'
Run Code Online (Sandbox Code Playgroud)

有人知道如何到达指针地址处的对象吗?当我在 C++ 程序中做同样的事情时,我没有得到任何错误。这是 C++ 类的实现,以防您想查看它:

人.cpp

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

Person::setParent(Person &p){
     parent=&p;
}
Run Code Online (Sandbox Code Playgroud)

注意:由于涉及完整类的其他原因,我无法通过持有Person实例 ( cdef Peron not_pointer) 来解决它。

ben*_*ngo 7

我应该阅读有关在 Cython 中使用 C++ 的整个 cython 文档。对于那些不知道的人,*在 Cython 中不能使用解引用运算符。相反,您需要dereferencecython.operator模块导入。当你想访问指向地址的对象时,你应该写dereference(pointer).

具体来说,我的问题的答案是编写cdef Person new_father=dereference(father.c_person).


Abd*_*man 5

另一种解决方案可能是0在 Cython 中取消引用指针的位置索引到指针。\n例如,假设我们有一个 gold_ratio C double 和一个 p_double C 指针:

\n
cdef double golden_ratio\ncdef double *p_double\n
Run Code Online (Sandbox Code Playgroud)\n

我们可以使用地址运算符 &golden_ratio\xe2\x80\x99s来分配地址:p_double

\n
p_double = &golden_ratio\n
Run Code Online (Sandbox Code Playgroud)\n

我们现在可以使用我们的\n零索引到取消引用语法来分配给golden_ratiothrough :p_double

\n
p_double[0] = 1.618\nprint(golden_ratio)\n# => 1.618\n
Run Code Online (Sandbox Code Playgroud)\n