2012-03-20 43 views
6

Sto avvolgendo una libreria C++ con cython. Nel file header, ci sono alcuni le strutture che ereditano da altre struct, in questo modo:C++ Struct inheritance in Cython

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

Come dovrebbe questo sguardo nel mio cdef extern... blocco?

risposta

5

Using C++ in Cython non menziona nulla di speciale:

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

classe wrapper:

#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 

Esempio:

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 

per costruirlo è necessario istruire pyximport di utilizzare 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]) 
+0

Posso semplicemente usare cppclass per struct? Se è così, sembra che io possa fare un'ereditarietà di classe, e che dovrebbe risolvere il mio problema: http://wiki.cython.org/gsoc09/daniloaf/progress#Inheritance – colinmarc

+0

@colinmarc: l'ho provato su cython 0.15 e lavori; i documenti potrebbero descrivere la versione precedente. Alla grande 'struct {..};' è equivalente a 'class {public: ..};' in C++. – jfs

+0

grazie per il tuo aiuto! – colinmarc