मैं एक कठिन समय है कि मैं क्या इतना पूछना मैं आपको एक उदाहरण देता हूँ करने के लिए कोशिश कर रहा हूँ का सवाल बनाने में आ रही वाक्य रचना अधिक भार:बेसिक ऑपरेटर C++
हम एक 3 डी प्रणाली है जहाँ हम पर काम कर रहे कहो एक वेक्टर वर्ग, Vec3 परिभाषित किया। हम स्पष्ट रेजोन के लिए कुछ अंकगणितीय ऑपरेटरों को अधिभारित करते हैं। इनमें से हम * ऑपरेटर को अधिभारित करते हैं ताकि वह दो वैक्टरों के डॉट उत्पाद को वापस कर दे। अब हमारी कोड कुछ इस तरह दिखना चाहिए:
class Vec3{
private:
float x, y, z;
public:
float operator*(const Vec3&) const; //dot product
.
.
.
अब कहते हैं कि हमें कुछ के साथ * ऑपरेटर का उपयोग करके हमारे वेक्टर पैमाने पर करने में सक्षम होना चाहते हैं, एक नाव का कहना है। इस घोषणा के द्वारा किया जा सकता है निम्नलिखित:
Vec3 operator*(const float) const;
friend Vec3 operator*(const float, const Vec3&);
यह दो भार के और सिर्फ एक साथ यह करने के लिए कोई तरीका है मैं सोच रहा हूँ, यानी कहते हैं कि हम ऊपर दो पंक्तियों के बजाय इस घोषित yeilds:
friend Vec3 operator*(const Vec3&, const Vec3&);
और फिर फ्लोट से कनवर्टन को संभालने के लिए Vec3 ctor के लिए डिफ़ॉल्ट मान जोड़ें।
Vec3 someVec3 = 1.0 * otherVec3; //through friend Vec3 operator*(const float, const Vec3&)
लेकिन नहीं
इस के लिए:
Vec3 someVec3 = otherVec3 * 1.0;
के रूप में संकलक पता नहीं दोनों में से कौन उपयोग करने के लिए:
यह पिछले उदाहरण के लिए काम करेगा
friend Vec3 operator*(const float, const Vec3&); //the one we want to use
or
float operator*(const Vec3&) const; //the one for the dot product
कोई सुझाव?
धन्यवाद!
दो ओवरलोड के साथ क्या गलत है? जैसा कि आप इंगित करते हैं, जब आप इसे अधिक विस्तारित करने का प्रयास करते हैं तो एक बदसूरत अस्पष्टता बनाई जाती है ... –
एकमात्र चीज जो मैं अलग-अलग करूँगा, स्केलर के दोनों संस्करणों को एक सदस्य होने के बजाय मित्र कार्यों को गुणा करना है, ताकि कोड होगा ऑपरेशन के रूप में एक ही समरूपता है। –
यह एक फ्लोट पास करने के लिए एक वेक्टर बनाने के लिए अक्षम होगा। यह एक रन टाइम अक्षमता होगी लेकिन एक अतिरिक्त ओवरलोडेड फ़ंक्शन को रेखांकित किया जा सकता है। – QuentinUK