2010-05-25 20 views
5

मैं इस कोड को देखा है, लेकिन मैं समझ नहीं सका कि वह क्या करता:अधिक भार -> ग में ऑपरेटर ++

inline S* O::operator->() const 
{ 
    return ses; //ses is a private member of Type S* 
} 

तो अब क्या होता है अगर मैं -> इस्तेमाल किया?

+0

बीटीडब्ल्यू, यह सी ++ है क्योंकि सी भाषा फ़ंक्शन और न ही ऑपरेटर ओवरलोडिंग की अनुमति नहीं देती है। यह एक और मुद्दा है जो दो भाषाओं को अलग करता है। –

उत्तर

2

> आप वर्ग हे का एक उदाहरण है और आप

obj->func() 

तो ऑपरेटर करना है सत्र देता है और फिर इसे वापस आ सूचक का उपयोग करता समारोह() कॉल करने के लिए।

पूर्ण उदाहरण:

struct S 
{ 
    void func() {} 
}; 

class O 
{ 
public: 
    inline S* operator->() const; 
private: 
    S* ses; 
}; 

inline S* O::operator->() const 
{ 
    return ses; 
} 

int main() 
{ 
    O object; 
    object->func(); 
    return 0; 
} 
+1

क्या होता है यदि एस के func() को इस तरह घोषित किया गया था: आभासी शून्य func() = 0; – hero

+0

आभासी कार्यों को कम से कम संरक्षित किया जाना चाहिए, लेकिन अधिमानतः निजी। यह सुनिश्चित करने के लिए कि एसई एक वैध वस्तु को इंगित कर रहा है, वर्ग एस की ज़िम्मेदारी है। –

+0

आभासी निजी कार्यों? जब तक आप मित्र वर्ग घोषणाओं से भरे न हों, मुझे लगता है कि निजी और आभासी ज्यादातर पारस्परिक रूप से अनन्य हैं। – luiscubal

0

यह एक अधिभारित ऑपरेटर है जो S प्रकार के किसी सदस्य को सूचक भेज देगा।

की तरह, अगर आप लिखना

O object; 
(object->)... 

हिस्सा (object->) अपने सूचक बन जाएगा। वर्ग हे की>, कि अब एक O *

-1

यह ऑपरेटर overloads> ऑपरेटर सत्र के लिए सूचक लौटा दी जाएगी।

+3

डिफ़ॉल्ट रूप से, कक्षा ओ में एक -> ऑपरेटर नहीं है जो ओ * देता है। –

0

कभी भी एक एस * बजाय रिटर्न ग्रुप ओ की एक वस्तु का उपयोग करता है - -

11

अब अगर आपके पास

O object; 
object->whatever() 

पहले अतिभारित operator-> बुलाया जाएगा, जो ses वस्तु के अंदर संग्रहित वापस आ जाएगी, तो operator-> (बिल्ट-इन S* के मामले में) लौटाए गए पॉइंटर के लिए फिर से बुलाया जाएगा।

तो

object->whatever(); 

स्यूडोकोड के बराबर है:

object.ses->whatever(); 

बाद पाठ्यक्रम O::ses के बाद से असंभव की होगी private है - यही कारण है कि मैं इसे कहते स्यूडोकोड है।

ऐसे अधिभार के साथ आप एक सूचक के चारों ओर एक रैपर बना सकते हैं - ऐसे रैपर को आमतौर पर स्मार्ट पॉइंटर कहा जाता है।

+0

"suce अधिभार के साथ" => क्या आपका मतलब "ऐसा" था या '->' ऑपरेटर का नाम "suce" है? (गैर देशी अंग्रेजी स्पीकर पूछना) – ereOn

+0

@ereOn: फिक्स्ड, जो टाइपो थे। – sharptooth

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