المشغل << overloading ostream
-
30-09-2019 - |
سؤال
من أجل استخدام Cout على هذا النحو: STD :: Cout << myObject ، لماذا يجب علي تمرير كائن Ostream؟ اعتقدت أن هذه كانت معلمة ضمنية.
ostream &operator<<(ostream &out, const myClass &o) {
out << o.fname << " " << o.lname;
return out;
}
شكرًا
المحلول
أنت لا تضيف وظيفة عضو آخر إلى ostream
, ، لأن ذلك سيتطلب إعادة تعريف الفصل. لا يمكنك إضافته إلى myClass
, ، منذ ostream
يذهب أولا. الشيء الوحيد الذي يمكنك القيام به هو إضافة تحميل زائد إلى وظيفة مستقلة ، وهو ما تفعله في المثال.
نصائح أخرى
فقط إذا كانت وظيفة عضو في الفصل ، فإنها ستكون الوسيطة الأولى. وبالتالي ، سيكون:
class ostream {
...
ostream &operator << (const myClass &o);
...
};
حيث ostream
تم كتابته قبل فترة طويلة من صفك ، سترى مشكلة الحصول على صفك هناك. وبالتالي ، يجب علينا تنفيذ المشغل كدالة قائمة بذاتها:
(return type) operator << ( (left hand side), (right hand side) );
عندما يتم تنفيذ المشغلين كوظائف عضو في الفئات ، فإن الجانب الأيسر هو this
, ، وتصبح الحجة الجانب الأيمن. (للمشغلين الثنائيين - يعمل مشغلي أحاديهم بشكل مشابه.)
لأنك تفرط في تحميل وظيفة مجانية ، وليس وظيفة عضو.