Если у меня есть абстрактный базовый класс и производный класс, который наследуется от него, но у меня есть другой класс, который принимает объект абстрактного базового класса в качестве аргумента, как мне его обернуть?Передача абстрактного класса C++ в качестве аргумента для Cython
class A {
public:
A(int x, int y);
virtual int FooA(int x, int y) = 0;
virtual void FooB() = 0;
}
class B : public A{
B(int x, int y, int z, int w);
int FooA(int x, int y);
void FooB();
void FooC(int z, int w);
}
class C {
public:
C(A* ptr, int p);
}
Как я могу обернуть это в целом? Я знаю, что я не должен обертывать абстрактный класс A, но у меня возникают трудности с упаковкой C, так как у меня нет объекта python для A
EDIT: На самом деле мне удалось обернуть класс, но я все еще получаю ошибки, которые Я проиллюстрирую далее.
source.pyx
cdef extern from "A.h"
cdef cppclass A:
A(int x, int y)
int FooA(int x, int y)
void FooB()
cdef extern from "B.h"
cdef cppclass B(A):
B(int x, int y, int z, int w)
int FooA(int x, int y)
void FooB()
void FooC(int z, int w)
cdef extern from "C.h"
cdef cppclass C:
C(A* ptr, int p)
cdef class pyA:
cdef A* baseptr
def __cinit__(self, int x, int y):
if type(self) is A:
self.baseptr = new A(int x, int y)
def __dealloc__(self):
if type(self) is A:
del self.baseptr
def FooA(self, int x, int y):
pass
def FooB(self):
pass
cdef class pyB(pyA):
def __cinit__(self, int x, int y, int z, int w):
if type(self) is pyB:
self.derivedptr = self.baseptr = new B(int x, int y, int z, int w)
def __dealloc__(self):
del self.derivedptr
def FooC(self, int z, int w):
self.derivedptr.FooC(int z, int w)
cdef class pyC:
cdef C *thisptr
def __cinit__(self, pyA ptr, int p):
self.thisptr(<A *> ptr.thisptr, int p)
def __dealloc__(self):
del self.thisptr
Это составитель, когда я испытывал ВПГ и передавая PYB в качестве первого аргумента, я получил:
TypeError: "Expected pyA, got pyB".
не должны PYB быть в состоянии быть переданы в качестве первый аргумент, так как это подкласс pyA? Или я в отъезде?
Вы можете, вероятно, избавиться от оставшейся ошибки путем удаление спецификатора типа 'PyA' из' PyC .__ cinit__'. [Также измените приведение на '', чтобы было возможно, что это может быть неправильный тип] – DavidW