Cython中的C++结构体继承

8

我正在使用cython封装一个C++库。在头文件中,有一些结构体继承自其他结构体,例如:

struct A { 
    int a;
};
struct B : A {
    int b;
};

这段内容应该如何在我的cdef extern...块中呈现?
1个回答

7

在Cython中使用C++并没有提到任何特殊的内容:

#file: pya.pyx
cdef extern from "a.h":
     cdef cppclass A:
        int a
     cdef cppclass B(A):
        int b

包装类:

#file: pya.pyx
cdef class PyB:
    cdef B* thisptr
    def __cinit__(self):
        self.thisptr = new B();
    def __dealloc__(self):
        del self.thisptr
    property a:
        def __get__(self): return self.thisptr.a
        def __set__(self, int a): self.thisptr.a = a
    property b:
        def __get__(self): return self.thisptr.b
        def __set__(self, int b): self.thisptr.b = b

例子:

import pyximport; pyximport.install(); # pip install cython

from pya import PyB

o = PyB()
assert o.a == 0 and o.b == 0
o.a = 1; o.b = 2
assert o.a == 1 and o.b == 2

要构建它,您需要指示pyximport使用C ++:
#file: pya.pyxbld
import os
from distutils.extension import Extension

dirname = os.path.dirname(__file__)

def make_ext(modname, pyxfilename):
    return Extension(name=modname,
                     sources=[pyxfilename, "a.cpp"],
                     language="c++",
                     include_dirs=[dirname])

我只能使用cppclass来代替struct吗?如果是的话,看起来我可以进行类继承,这应该能解决我的问题:http://wiki.cython.org/gsoc09/daniloaf/progress#Inheritance - colinmarc
@colinmarc:我在cython 0.15上尝试了它,它可用;文档可能描述的是旧版本。在C++中,大型'struct{..};'等效于'class{public: ..};'。 - jfs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接