Как вернуть C ++ обернутый объект в Cython - PullRequest
1 голос
/ 18 апреля 2019

Я новичок в Cython.Я пытаюсь создать оболочку Cython для Python из следующего примера кода C ++.Приведенный ниже пример является всего лишь макетом, иллюстрирующим то, что я делаю в своем проекте, и проблему, с которой я сталкиваюсь.

C ++ class

Ah

class A {
  public:
    A();
    B * newB(){
      return new B(this, "");
    }
};

Bh

class B {
  public:
    B(A * a, const char * cwd);
};

В Cython:

файл classes.pxd:

cdef extern from "A.h":
    cdef cppclass A:
        A() except +
        B * newB()
// Both classes in same .pxd file
cdef extern from "B.h":

файл classes.pyx:

cimport classes
from libcpp cimport bool

cdef class PyA:
    cdef classes.A *thisptr
    def __cinit__(self):
        self.thisptr = new classes.A()
    def newB(self):
        cdef PyB val = PyB()
        val.thisxptr = classes.newB()
        return val

cdef class PyB:
     cdef classes.B *thisxptr

     def __cinit__(self):
        self.thisxptr = NULL
     def __dealloc__(self):
        if self.thisxptr != NULL:
           del self.thisxptr

В сводном классе B должен быть создан с помощью метода newB() в классе A, главным образом потому, что класс A определенных ключевых свойств и ресурсов, которые понадобятся классу B.Но я получаю следующую ошибку:

Невозможно преобразовать объект Python в 'B *'

...