2017-03-05 10 views
5

साइथन दस्तावेज shows ओवरलोडेड विधियों के साथ मौजूदा सी ++ कक्षाओं को घोषित करने का तरीका।सीपीएलक्लास साइथन/सी ++ परिभाषाओं में टूटा हुआ ओवरलोडिंग है?

हालांकि, अगर मैं परिभाषित मेरे अपने cppclass एक ओवरलोड विधि के साथ ...

cdef cppclass point: 
    float x, y 

    point(): 
     this.x = 0 
     this.y = 0 

    float sum(): 
     return this.x + this.y 

    float sum(int z): # COMPILE ERROR 
     return this.x + this.y + z 

... मैं मिल

समारोह हस्ताक्षर पिछले घोषणा से मेल नहीं खाता

कन्स्ट्रक्टर को ओवरलोड करना वही त्रुटि देता है:

cdef cppclass point: 
    float x, y 

    point(): 
     this.x = 0 
     this.y = 0 

    point(float X, float Y): # COMPILE ERROR 
     this.x = X 
     this.y = Y 

    float sum(): 
     return this.x + this.y 

क्या मैं यह गलत तरीके से कर रहा हूं, या क्या यह सुविधा गायब है?

अद्यतन: डिफ़ॉल्ट तर्क भी व्यर्थ होने लगते हैं:

cdef cppclass point: 
    float x, y 

    point(float X=0, float Y=0): 
     this.x = X 
     this.y = Y 

    float sum(): 
     return this.x + this.y 

cdef float use_point(): 
    cdef point p 
    p = point(1, 2) 
    return p.sum() 

... गुजरता Cython, लेकिन सी ++ संकलक ("तर्कों की गलत संख्या")

+0

क्या आपने कन्स्ट्रक्टर के अंत में '' 'को छोड़कर कन्स्ट्रक्टर के अंत में जोड़ने का प्रयास किया है ताकि यह देखने के लिए कि कन्स्ट्रक्टर के कारण कोई अपवाद होता है या नहीं? – Crt

+0

शायद किसी एक नाम का नाम बदल सकता है क्योंकि उनके पास एक ही नाम – Crt

+0

है * उनके पास वही नाम है * - यह ओवरलोडिंग – MaxB

उत्तर

3

जैसा कि मैंने एक टिप्पणी में कहा था: यह स्पष्ट रूप से एक बग/असमर्थित सुविधा है, और इसलिए इसे पोस्ट करने के बजाय Cython issues list on github पर इसकी रिपोर्ट करने के लिए शायद अधिक उपयोगी है।

हालांकि, यदि आप निम्न काम करता है एक hacky अल्पकालिक workround तो में रुचि रखते हैं:

float sum(...): 
     return this.x + this.y 

    float sum2 "sum"(int z): 
     return this.x + this.y + z 

# A test function to prove it 
def test(): 
    cdef point pt 
    a = pt.sum() 
    b = pt.sum(3) 

    return a,b # returns (0.0, 3.0) 

2 चाल

  1. Cython आप एक "वास्तविक निर्दिष्ट कर सकते हैं का उपयोग करता है "उद्धरण में डालकर फ़ंक्शन के लिए नाम। इस प्रकार float sum2 "sum"(int z): फ़ंक्शन sum को कॉल करने के समाप्त होता है, लेकिन यह साइथन को चालित करता है ताकि यह उसी नाम का पुन: उपयोग करने से पंजीकृत न हो। स्वचालित सी ++ प्रकार की कटौती हालांकि सही ढंग से काम करेगी।

  2. ... (यानी सी varargs) कुछ भी मेल खाएगा लेकिन इसे सी ++ प्रकार की कटौती तंत्र द्वारा सबसे कम प्राथमिकता दी गई है। इसलिए sum(3) से आगे sum(int) चुनता है। यह साइथॉन को प्रकारों के बारे में बहुत कठिन सोचने से रोकता है और इसे सी ++ (वांछित के रूप में) तक छोड़ देता है। नकारात्मकता यह है कि यह आपको नहीं बताएगा कि क्या आप तर्कों की एक बड़ी गैरकानूनी सूची पास करते हैं लेकिन चुपचाप (...) संस्करण को कॉल करेंगे।

यह हैक रचनाकारों के लिए काम नहीं करता है, और रचनाकारों के लिए काम करना आसान नहीं लगता है।

1

द्वारा फिसल गया हो जाता है पृष्ठ you reference अपने पहले भाग में मौजूदा सी ++ कक्षाओं में इंटरफेस को उजागर करने के उदाहरण दिखाता है। ऐसे मामले में अधिभारित तरीकों की अनुमति है। मुझे नहीं लगता कि साइथन में कक्षाओं को लागू करते समय ओवरलोडिंग की अनुमति है। पृष्ठ का दूसरा भाग दिखाता है कि रैपर को कैसे कार्यान्वित करें - सी ++ कक्षाओं को लपेटने वाले साइथन कक्षाएं। उदाहरण पर एक नज़र डालें:

cdef class PyRectangle: 
    cdef Rectangle c_rect  # hold a C++ instance which we're wrapping 
    def __cinit__(self, int x0, int y0, int x1, int y1): 
     self.c_rect = Rectangle(x0, y0, x1, y1) 
    def get_area(self): 
     return self.c_rect.getArea() 
    def get_size(self): 
     cdef int width, height 
     self.c_rect.getSize(&width, &height) 
     return width, height 
    def move(self, dx, dy): 
     self.c_rect.move(dx, dy) 

निर्माता __cinit__ नाम पर है। यह पाइथन में समान काम करता है। साइथन सिंटैक्स पाइथन में है। मुझे नहीं लगता कि आप अपने कन्स्ट्रक्टर को कक्षा के नाम के समान नाम दे सकते हैं। आपने __init__ और न ही __cinit__ प्रदान नहीं किया है, इस प्रकार डिफ़ॉल्ट कन्स्ट्रक्टर को कोई तर्क नहीं मिलता है।

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