2012-03-20 17 views
6

Cython'lu bir C++ kitaplığı paketliyorum. başlıklar dosyasında, diğer yapılar devralan bazı yapılar şöyle vardır:C++ Cython'daki yapı devri

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

nasıl olmalıdır benim cdef extern... bloğunda bu bakış?

cevap

5

Using C++ in Cython özel bir şey söz etmez:

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

Sarıcı sınıfı:

#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 

Örnek:

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 

Eğer ++ c kullanmayı pyximport talimat gerekiyor onu inşa etmek için:

#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

Yapı için cppclass'i kullanabilir miyim? Eğer öyleyse, sınıf kalıtımını yapabilirim ve problemimi çözmem gerekiyor: http://wiki.cython.org/gsoc09/daniloaf/progress#Inheritance – colinmarc

+0

@colinmarc: Bunu 0.15 cython üzerinde denedim ve Eserleri; Dokümanlar eski sürümü açıklayabilir. Büyüktür = struct {..}; ', C++ 'da sınıf {public: ..};' ile eşdeğerdir. – jfs

+0

Yardımlarınız için teşekkürler! – colinmarc