2012-11-24 8 views
8

मैं ऑपरेटरों को ओवरलोड करने के लिए नया हूं, मैंने कुछ खोज की और this helpful article पाया, मैंने अपना खुद का कोड लिखा जैसे लेखक ने मुझे vector vector::operator*(float, vector) must take either zero or one argument त्रुटि प्राप्त की।लोडिंग * ऑपरेटर पर - शून्य या एक तर्क लेना चाहिए

यहाँ मेरी कोड है:

class vector 
{ 
     public: 
     float x; 
     float y; 

     vector(float, float); 
     float operator$ (vector, vector); 
     vector operator* (float, vector); 
     vector operator* (vector, float); 
}; 

vector::vector(float _x = 0, float _y = 0) 
{ 
    x = _x; 
    y = _y;  
} 
const float vector::operator$ (const vector &v1, const vector &v2) 
{ 
    return (v1.x * v2.x) + (v1.y * v2.y); 
} 

const vector vector::operator* (const float &m, const vector &v) 
{ 
    vector ret_val = v; 
    ret_val.x *= m; 
    ret_val.y *= m; 
    return ret_val; 
} 

const vector vector::operator* (const vector &v, const float &m) 
{ 
     return m * vector;  
} 

मेरे ऑपरेटिंग सिस्टम kubuntu 12.04 है और मेरी आईडीई dev-C++ शराब खिड़कियों कार्यक्रम लोडर का उपयोग कर लिनक्स पर चल रहा है।

+3

पहली बार मैंने कभी किसी को अधिभार '' $ ..... – 0x499602D2

+0

देखा है मैं वैक्टर में डॉट उत्पाद का प्रतिनिधित्व करने के लिए एक अच्छा ऑपरेटर को खोजने की कोशिश की, कुछ भी नहीं अच्छा मेरे मन में आया था; क्या हम एक नया ऑपरेटर परिभाषित कर सकते हैं जैसा मैंने किया था? –

उत्तर

15

क्योंकि आप operator*() एक सदस्य समारोह के रूप में परिभाषित कर रहे हैं, वहाँ पहले से ही एक अंतर्निहित पैरामीटर है: जिसके लिए वस्तु विधि शुरू हो जाती है! इसलिए, सदस्य कार्य एक स्पष्ट पैरामीटर लेते हैं, दो नहीं।

+0

हम इस द्वारा निहित पैरामीटर तक पहुंच सकते हैं। ... ', क्या मैं सही हूँ? –

+0

@EBi यह सही है कि आप कर सकते हैं, लेकिन आपको वास्तव में इसकी आवश्यकता नहीं है। 'यह-> x' किसी सदस्य फ़ंक्शन के अंदर केवल 'x' के बराबर है। कंपाइलर 'x' से' this-> x' में परिवर्तित हो जाएगा। – chrisaycock

7

बस कक्षा के बाहर अपने ऑपरेटर अधिभार समारोह की घोषणा। इसके अलावा आप एक कॉन्स लौट रहे हैं जो शायद आप नहीं चाहते हैं।

class foo { 
    //code 
}; 

foo operator*(foo& lhs, bar& rhs) const; 
foo operator*(bar& lhs, foo& rhs) const; 
+0

कक्षा के बाहर ऑपरेटर ओवरलोड फ़ंक्शन क्यों घोषित करें? – user2131316

+2

यह लिंक कारण बताते हैं। आशा करता हूँ की ये काम करेगा। http://stackoverflow.com/questions/4652932/why-define-operator-or-outside-a-class-and-how-to-do-it-properly – ajp013

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