سؤال

من أجل استخدام 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, ، وتصبح الحجة الجانب الأيمن. (للمشغلين الثنائيين - يعمل مشغلي أحاديهم بشكل مشابه.)

لأنك تفرط في تحميل وظيفة مجانية ، وليس وظيفة عضو.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top