इस सेटअप के साथ समस्या यह है कि ऑपरेटर < < ऊपर परिभाषित एक नि: शुल्क फ़ंक्शन है, जो वर्चुअल नहीं हो सकता है (इसमें कोई रिसीवर ऑब्जेक्ट नहीं है)। फ़ंक्शन वर्चुअल बनाने के लिए, इसे कुछ वर्ग के सदस्य के रूप में परिभाषित किया जाना चाहिए, जो यहां समस्याग्रस्त है क्योंकि यदि आप कक्षा के सदस्य के रूप में ऑपरेटर < < को परिभाषित करते हैं तो ऑपरेंड गलत क्रम में होंगे:
class MyClass {
public:
virtual ostream& operator<< (ostream& out) const;
};
मतलब यह है कि
MyClass myObject;
cout << myObject;
संकलन नहीं होगा, लेकिन
MyClass myObject;
myObject << cout;
कानूनी हो जाएगा।
इसे ठीक करने के लिए, आप सॉफ्टवेयर इंजीनियरिंग के मौलिक प्रमेय को लागू कर सकते हैं - किसी भी समस्या को संकेत की एक और परत जोड़कर हल किया जा सकता है।
ostream& operator<< (ostream& out, const MyClass& mc) {
mc.print(out);
return out;
}
के रूप में फिर
class MyClass {
public:
virtual void print(ostream& where) const;
};
, परिभाषित ऑपरेटर < < इस तरह, ऑपरेटर < <: बल्कि ऑपरेटर < < आभासी, वर्ग, जो ऐसा दिखता करने के लिए एक नया आभासी समारोह जोड़ने पर विचार कर रही है की तुलना में नि: शुल्क फ़ंक्शन में सही पैरामीटर ऑर्डर है, लेकिन ऑपरेटर < < का व्यवहार सबक्लास में अनुकूलित किया जा सकता है।
आशा है कि इससे मदद मिलती है!
धन्यवाद यह बहुत उपयोगी है। मैंने सोचा कि यह समाधान एक समाधान है, लेकिन मैंने सोचा कि शायद एक और तरीका है जिसे मैं कार्यान्वयन के लिए आसान नहीं जानता। –
* "किसी भी समस्या को संकेत की एक और परत जोड़कर हल किया जा सकता है" * - याद रखें, संकेत की बहुत सारी परतों की समस्या को छोड़कर कोई समस्या;) – Kos
@ कोस: नहीं, नहीं। जब तक आपने इसे 'हस्ताक्षरित अप्रत्यक्षता घोषित कर दिया हो;', आपको केवल अधिक से अधिक संकेत जोड़ने को जोड़ना होगा और जब आप –