سؤال

أنا واجهت المتاعب في محاولة لتنفيذ وظائف التسلسلية بعض الطبقات في اللعبة.انا تخزين بعض البيانات الخام ملف نصي و أريد أن تكون قادرة على حفظ وتحميل من ذلك.تفاصيل هذه ، ومع ذلك ، ليست ذات صلة.المشكلة هي أن أحاول أن جعل لكل كائن مثيرة للاهتمام بالنسبة حفظ الملف إلى أن تكون قادرة على تسلسل نفسها.لهذا يجب تعريف واجهة ISerializable مع بحتة الظاهري الإعلانات من المشغل<< و المشغل>>.

التسلسل الهرمي فئة تبدو شيئا مثل هذا

              -> GameObject -> Character -> Player ...
ISerializable               -> Item -> Container ...
              -> Room ...

هذا يعني أن هناك العديد من الحالات الممكنة من أجل التسلسلية الكائنات من فئات مختلفة.حاويات ، على سبيل المثال ، يجب استدعاء المشغل<< على جميع البنود الواردة.

الآن, منذ المشغل>> هو ظاهري ، فكنت إذا أردت أن تسلسل شيء أن تنفذ وظائف محددة في ISerializable أنا فقط يمكن أن تفعل شيئا مثل

ostream & Player::operator<<(ostream & os){
    Character::operator<<(os);
    os << player_specific_property 1 << " " 
       << player_specific_property 2 << "...";
    return os;
}

ثم

ostream & Character::operator<<(ostream & os){
    GameObject::operator<<(os);
    os << character_specific_property 1 << " " 
       << character_specific_property 2 << "...";
    return os;
}

ولكن سرعان ما تعلمت أن هذه المحاولة الأولى كانت غير قانونية.ما أطلبه هنا كيف يمكنني التغلب على هذه?

أنا لا أشعر تنفيذ وظيفة يدويا لكل فئة.أعتقد أنا أبحث عن شيء من هذا القبيل super وظائف من جافا.

أي مساعدة هي موضع تقدير.

-- التعليقات على تحرير ------------

حسنا, آخر مرة كنت في عجلة من امرنا عندما كنت أكتب السؤال.رمز هو الآن أكثر مثل ما كان عندما حاولت تجميع.أنا ثابت على السؤال و المشكلة كان لا علاقة لها السؤال.أنا أخجل أن أقول كان سببه خطأ في أعقاب كبير إعادة بيع ديون رمز ، وحقيقة أن المشغل لم ينفذ في كل قاعدة الطبقة.

شكرا جزيلا على الردود ولكن!

هل كانت مفيدة؟

المحلول

المشكلة ليست في محاولة استدعاء دالة ظاهري غير تقريبا.المشكلة هو هذا السطر: os = Character::operator<<(os);.هذا هو مهمة ، ولكن std::ostream لا يكون operator=.

أنت لا تحتاج إلى الإحالة على أي حال.تيار عاد هو نفسه تيار تيار يمكنك تمرير في.السبب الوحيد انه عاد هو حتى تتمكن من سلسلة لهم.

ومن ثم الإصلاح هو مجرد تغيير التعليمات البرمجية

ostream & Player::operator<<(ostream & os){
    Character::operator<<(os);
    os << player_specific_property 1 << " " 
       << player_specific_property 2 << "...";
    return os;
}

نصائح أخرى

هذا ليس كيف إثقال المشغل<< بالنسبة ostream يعمل.اليسرى المشغل هو ostream (ومن هنا يجب أن الزائد على أنها وظيفة خالية) و اليد اليمنى المشغل هو الكائن الخاص بك (والذي هو السبب الظاهري الآلية لا تعمل بسهولة.

أنا افترض أنك يمكن أن محاولة:

class Base
{
    //...
    virtual std::ostream& output(std::ostream&) const;
};

std::ostream& operator<< (std::ostream& os, const Base& obj)
{
    return obj.output(os);
}

الآن فئة مشتقة طبيعيا أن نسميه أسلوب الإخراج من الأصل(s):

class Derived: public Base
    //...
    virtual std::ostream& output(std::ostream& os) const
    {
        Base::output(os);
        return os << my_specific_data;
    }
};
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top