2012-03-20 11 views
6

मैं साइथन के साथ एक सी ++ लाइब्रेरी लपेट रहा हूं। हेडर फाइल में, कुछ structs कि अन्य structs से विरासत है, इसलिए की तरह हैं:सी ++ साइथन में संरचना विरासत

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

कैसे मेरी cdef extern... ब्लॉक में इस देखना चाहिए?

उत्तर

5

Using C++ in Cython कुछ भी विशेष उल्लेख नहीं है:

#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 

इसे बनाने के लिए आप C++ उपयोग करने के लिए pyximport को निर्देश देने की जरूरत है:

#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

मैं सिर्फ संरचना के लिए cppclass का उपयोग कर सकते हैं? यदि ऐसा है, ऐसा लगता है कि मैं कक्षा विरासत कर सकता हूं, और इससे मेरी समस्या हल होनी चाहिए: http://wiki.cython.org/gsoc09/daniloaf/progress#Inheritance – colinmarc

+0

@colinmarc: मैंने इसे साइथन 0.15 पर आजमाया है और यह काम करता है; दस्तावेज़ पुराने संस्करण का वर्णन कर सकते हैं। बड़ी 'संरचना {..}; '' वर्ग {सार्वजनिक: ..}; 'सी ++ में बराबर है। – jfs

+0

आपकी मदद के लिए धन्यवाद! – colinmarc

संबंधित मुद्दे