अन्य उत्तर यहाँ समस्या का समाधान होगा, लेकिन निम्नलिखित पैटर्न का उपयोग मैं जब मैं यह कर रहा हूँ है:
class Num
{
public:
Num(int i) // Not explicit, allows implicit conversion to Num
: i_ (i)
{
}
Num (Num const & rhs)
: i_ (rhs.i_)
{
}
Num & operator+= (Num const & rhs) // Implement +=
{
i_ += rhs.i_;
return *this;
}
private:
int i_;
};
//
// Because of Num(int), any number on the LHS or RHS will implicitly
// convert to Num - so no need to have lots of overloads
Num operator+(Num const & lhs, Num const & rhs)
{
//
// Implement '+' using '+='
Num tmp (lhs);
tmp+=rhs;
return tmp;
}
इस दृष्टिकोण के प्रमुख लाभों में से एक है कि अपने कार्यों एक दूसरे के संदर्भ में लागू किया जा सकता है जो आपको आवश्यक समग्र कोड की मात्रा को कम करता है।
अद्यतन:
बे पर प्रदर्शन चिंताओं रखने के लिए, मैं शायद की तरह एक इनलाइन समारोह कुछ के रूप में गैर सदस्य ऑपरेटर + निर्धारित करना होगा:
inline Num operator+(Num lhs, Num const & rhs)
{
lhs+=rhs;
return lhs;
}
सदस्य आपरेशन भी इनलाइन हैं (के रूप में वे 'वर्ग निकाय में घोषित किया गया है) और इसलिए सभी कोड में दो कच्चे int
वस्तुओं को जोड़ने की लागत के बहुत करीब होना चाहिए।
अंत में, जैसा कि आधे से इंगित किया गया है, सामान्य रूप से अंतर्निहित रूपांतरणों को अनुमति देने के परिणामों पर विचार किया जाना चाहिए। उपर्युक्त उदाहरण मानता है कि एक अभिन्न प्रकार से 'न्यू' में परिवर्तित करना समझदारी है।
स्रोत
2009-07-27 15:03:25
+1। आपको गैर-सदस्य संस्करणों को वैसे भी पसंद करना चाहिए, यहां तक कि उन मामलों में जहां यह जरूरी नहीं है। जब आपको करना है तो केवल सदस्य रूपों का उपयोग करें। – jalf
मैं हमेशा अपने गैर-सदस्य ऑपरेटरों से मित्रता करना पसंद करता हूं। –