2012-06-22 9 views
10

मैं अतिभारित है इससी ++ में दो से अधिक वस्तुओं के लिए ओवरलोडेड एडिशन असाइनमेंट ऑपरेटर?

class sample 
{ 
private : 
    int x; 
public : 
    sample(int x1 =0) 
    { 
    x = x1; 
    } 

    sample operator+(sample s); 
}; 

sample sample::operator+(sample s) 
{ 
    x = x + s.x; 
    return *this; 
} 

int main() 
{ 
    sample s1(10); 
    sample s2; 
    s2 = s2 + s1; 
    return 0;  
} 

तरह + ऑपरेटर यह सही है? मेरा सवाल यह है कि यदि मैं दो अलग-अलग नमूना वस्तुओं को जोड़ना चाहता हूं तो मैं ओपेरटर को कैसे अधिभारित करूंगा; उदाहरण के लिए s = s1 + s2;

मुझे मौजूदा कार्यान्वयन के साथ s = s + s1 + s2 करना पसंद है।

+2

यहाँ देखो! http://courses.cms.caltech.edu/cs11/material/cpp/donnie/cpp-ops.html या यहां http://www.cprogramming.com/tutorial/operator_overloading.html – trumpetlicks

+1

ध्यान दें कि 'ऑपरेटर +' _not_ होना चाहिए '+' के बाईं ओर ऑब्जेक्ट का मान बदलें, लेकिन आपका करता है। यदि आपने 's3 = s1 + s2' लिखा है, तो आपका कोड परिणाम को पकड़ने के लिए' s1' बदल देगा। –

+0

इसके अलावा, 'मुख्य' में 'int' रिटर्न प्रकार है। –

उत्तर

13

दोस्त ऑपरेटर अधिभार का उपयोग करते हुए आप के लिए चाल कर सकते हैं और एक आम तरीका है द्विआधारी ऑपरेटरों को परिभाषित करने के लिए है चाहिए, बस जोड़ें:

friend sample operator+(const sample& a, const sample& b); //in class 

sample operator+(const sample& a, const sample& b) { //outside the class 
    return sample(a.x + b.x); 
} 

आप इसे उसके सदस्य बने रहना चाहते हैं, (जो कुछ दुर्लभ में कमियां है

इनमें से
sample operator+(sample s) const; //in class 

sample sample::operator+(const sample& b) const { //outside the class 
    return sample(this->x + b.x); 
} 

या तो ऑपरेटर श्रृंखलन अनुमति देगा: परिदृश्य, और कोई तेजी) हैं, तो ऑपरेटर एक const समारोह बनाने के लिए किया है। आपके पिछले s = s + s1 + s2 विफल होने का कारण यह है कि s + s1 निष्पादित होगा और अस्थायीsample ऑब्जेक्ट निष्पादित करेगा। फिर, यह उस नमूने में s2 जोड़ने का प्रयास करेगा। हालांकि, अस्थायी केवल const संदर्भ [1] हो सकते हैं, और इस तरह, केवल const सदस्य फ़ंक्शंस का उपयोग कर सकते हैं। चूंकि आपका operator+ सदस्य फ़ंक्शन const फ़ंक्शन नहीं है, इसलिए आप const अस्थायी पर उस फ़ंक्शन का उपयोग नहीं कर सकते हैं। ध्यान दें कि इसे const बनाने के लिए, मुझे इसे फिर से लिखना पड़ा, क्योंकि आपका संस्करण + के बाईं ओर ऑब्जेक्ट को संशोधित करता है।

[1] के साथ अपवाद यहाँ विशेष रूप से प्रासंगिक नहीं हैं, अर्थात् rvalues ​​

+0

यह ठीक दिखता है। क्या यह दोस्त का उपयोग करके इसका एकमात्र तरीका है। – Raulp

+0

क्षमा करें, मुझे प्रश्न समझ में नहीं आ रहा है, क्या आप पूछ रहे हैं कि 'मित्र' कीवर्ड का उपयोग करना आवश्यकता को प्राप्त करने का एकमात्र तरीका है? – higuaro

+0

मेरा मतलब मित्र समारोह का उपयोग किए बिना किया जा सकता है। लेकिन मुझे लगता है कि यह एकमात्र तरीका है। – Raulp

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