2010-01-28 6 views
55

मैं वेक्टर वर्ग को लागू कर रहा हूं और मुझे कुछ वेक्टर के विपरीत होने की आवश्यकता है। क्या ऑपरेटर ओवरलोडिंग का उपयोग करके इस विधि को परिभाषित करना संभव है?सी ++ में यून्री माइनस ऑपरेटर को ओवरलोड कैसे करें?

यहाँ मैं क्या मतलब है:

Vector2f& oppositeVector(const Vector2f &_vector) 
{ 
x = -_vector.getX(); 
y = -_vector.getY(); 

return *this; 
} 

धन्यवाद:

Vector2f vector1 = -vector2; 

यहाँ मैं इस ऑपरेटर पूरा करने के लिए चाहते हैं।

+4

स्टाइल टिप्पणी: '_' के साथ अपने चर को उपसर्ग न करें। यह शैली कार्यान्वयन (कंपाइलर) के लिए आरक्षित है और आपके पास संघर्ष हो सकते हैं। साथ ही, पाठकों को '_' उपसर्ग के कारण कार्यान्वयन चर के रूप में आपके चर को अनजाने में पहचानते हैं। आपको कार्यों के अंदर '_' का उपयोग करने की आवश्यकता नहीं है; वे इसके बिना पठनीय होंगे। –

+4

दो अंडरस्कोर कार्यान्वयन के लिए आरक्षित हैं, केवल एक ही नहीं। –

+0

मुझे विश्वास है कि यह _MACROs और __identifiers है। – Puppy

उत्तर

96

हाँ, पर आप इसे एक पैरामीटर के साथ प्रदान नहीं करते हैं:

class Vector { 
    ... 
    Vector operator-() { 
    // your code here 
    } 
}; 

ध्यान दें कि आप वापस * इस नहीं करना चाहिए।

class Vector { 
    ... 
    Vector operator-() const { 
     Vector v; 
     v.x = -x; 
     v.y = -y; 
     return v; 
    } 
}; 
+5

+1: एकमात्र सही समाधान -_- –

+1

यह गलत है: यह v.x = -x होना चाहिए; v.y = -y; – sergiom

+6

@ कॉर्नेल किस्लेविच: इसे कॉल करना "केवल * सही समाधान" भ्रामक है। यूनरी '-' को एक स्टैंडअलोन फ़ंक्शन द्वारा अधिभारित किया जा सकता है, जो 'विपरीत वेक्टर' के ओपी के कार्यान्वयन को बारीकी से दर्पण करेगा। – AnT

24

यह

Vector2f operator-(const Vector2f& in) { 
    return Vector2f(-in.x,-in.y); 
} 

बाहर वर्ग के भीतर हो सकता है, या है। मेरा नमूना नामस्थान क्षेत्र में है।

+0

+1 पर '.getX() 'और' .getY() 'का उपयोग क्यों कर रहे हैं, यह पकड़ने के लिए कि आपको एक नया वेक्टर 2 एफ उदाहरण वापस करने की आवश्यकता है, वर्तमान ऑब्जेक्ट का संदर्भ नहीं। – MikeSep

+1

यह * बाइनरी * ऑपरेटर- के कार्यान्वयन है। यूनियन के पास कोई पैरामीटर नहीं है जैसा @anon ने कहा था। –

+4

नहीं, यह एक यूनरी ऑपरेटर है। यह 'Vector2f' पैरामीटर के रूप में लेता है क्योंकि इसे कक्षा के दायरे के बजाय नामस्थान में परिभाषित किया गया है। मेरी प्रतिक्रिया सही है। –

-2

सिर्फ इस के लिए उत्तर के लिए देख रहा था, जबकि: - एकल ऑपरेटर एक नया वेक्टर मान बनाने के लिए, बात यह करने के लिए लागू किया जाता है बदल नहीं है, तो आपके कोड कुछ इस तरह देखने के लिए चाहते हो सकता है की जरूरत है सी ++ (जीएमपी के आधार पर) में उच्च परिशुद्धता अंकगणितीय पुस्तकालय डिजाइन करना। क्या कहा जा रहा है इसके विपरीत, कि यूनरी "-" को नया मान वापस करना है, यह कोड मेरे लिए काम करता है:

bigdecimal& bigdecimal::operator -() { 
    mpf_neg(this->x, this->x);//set left mpf_t var to -right 
    return *this; 
} 
+2

यह कोड अजीब और अद्भुत (ly निराशाजनक) तरीकों से तोड़ने जा रहा है। यह काम कर सकता है .. लेकिन आप इसके साथ अपने पैर उड़ा देंगे। – ioquatix

+0

तो अगर मैं 'y = -x; 'करता हूं, तो क्या मुझे' x' के मान को बदलने की उम्मीद करनी चाहिए? – patatahooligan

+0

सी ++ 11 पर प्रदर्शन कारणों के लिए जो इस प्रश्न को पोस्ट करता है, आप एक बड़े वेक्टर के लिए एक रावल ऑपरेटर के लिए हो सकता है। –