将抽象类作为参数传递给C++ Cython
Passing C++ abstract class as argument to 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 时遇到困难,因为我没有 A 的 python 对象
编辑:实际上我设法包装了类,但我仍然收到错误,我将进一步说明。
来源.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
当我测试 pyC 并将 pyB 作为第一个参数传递时,我得到了:
TypeError: "Expected pyA, got pyB".
pyB 不应该作为第一个参数传递,因为它是 pyA 的子类吗?还是我离得很远?
我的回答很晚。但对于那些可能感兴趣的人,这里是工作代码。
啊
#ifndef A_H_
#define A_H_
class A {
public:
virtual int FooA(int x, int y) = 0;
virtual void FooB() = 0;
};
#endif /* A_H_ */
B.h
#ifndef B_H_
#define B_H_
#include "A.h"
class B : public A{
public:
B(int x, int y, int z, int w);
int FooA(int x, int y);
void FooB();
void FooC(int z, int w);
};
#endif /* B_H_ */
C.H
#ifndef C_H_
#define C_H_
#include "A.h"
class C {
public:
C(A* ptr, int p);
};
#endif /* C_H_ */
B.cpp
#include "B.h"
#include <iostream>
using namespace std;
B::B(int x, int y, int z, int w)
{
cout << "B::B" << endl;
cout << x << " " << y << " "
<< z << " " << w << endl;
}
int B::FooA(int x, int y)
{
cout << "B::FooA" << endl;
cout << x << " " << y << endl;
return 0;
}
void B::FooB()
{
cout << "B::FooB" << endl;
}
void B::FooC(int z, int w)
{
cout << "B::FooC" << endl;
cout << z << " " << w << endl;
}
C.cpp
#include "C.h"
#include <iostream>
using namespace std;
C::C(A* ptr, int p)
{
cout << "C::C" << endl;
cout << ptr->FooA(0,1) << endl;
ptr->FooB();
}
来源.pyx
# distutils: language = c++
# distutils: sources = [B.cpp, C.cpp]
cdef extern from "A.h":
cdef cppclass A:
A(int x, int y) except +
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) except +
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) except +
cdef class pyA:
cdef A *baseptr
def __cinit__(self):
pass
def FooA(self, int x, int y):
pass
def FooB(self):
pass
cdef class pyB(pyA):
cdef B *derivedptr
def __cinit__(self, int x, int y, int z, int w):
self.derivedptr = new B(x, y, z, w)
self.baseptr = self.derivedptr
def __dealloc__(self):
del self.derivedptr
def FooC(self, int z, int w):
self.derivedptr.FooC(z, w)
cdef class pyC:
cdef C *thisptr
def __cinit__(self, pyA ptr, int p):
self.thisptr = new C(ptr.baseptr, p)
def __dealloc__(self):
del self.thisptr
setup.py
from distutils.core import setup
from Cython.Build import cythonize
setup(
name = 'testapp',
ext_modules = cythonize('*.pyx'),
)
最后,编译
$python setup.py build_ext --inplace
相关文章:
- 将 PCL 链接到 Cython C++ 模块
- 将数组/向量发送到 c++ 脚本的 cython 示例
- Cython:无法分配给 2D 矢量
- Cython通过浮点数的最快方式,用于高频控制回路
- Cython 包含catkin_pkg设置的错误
- 在 Cython 中传递浮点数组的最佳选择
- 如何在 Cython 中定义返回 cpp 定义类型的函数?
- 通过Cython对Python的基本C++函数
- 在 Cython 中将C++向量转换为 numpy 数组,而无需复制
- 从python调用C++函数,使用cython,使用cythonize
- 如何通过 cython 将 numpy 数组列表传递给 C++
- 可以使用while(文件>>...C++成语在 Cython 中读取文件?
- "Cannot convert Python object argument to type '<typename>'" - 使用 Cython 包装 C++ 类时出错
- Cython中带有自定义比较器的优先级队列
- 重载的 operator() 在 Cython 中失败
- 在Cython中使用C库时,我遇到了一个错误
- 在C++/Cython中,是否可以只声明相关属性在Python中可见
- Cython正在获取C++对象列表的长度
- 在C++程序中调用Cython(Python3.6)
- 在 Cython 中创建一个连续数组并将其传递给C++