الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

اختبر قدراتك في C/CPP - الحلقة الرابعة, الجزء السابع عشر

مغلق
بدأه Snack3r في 16 سبتمبر 2012 · 4 رد · 1,092 مشاهدة · في اختبر قداراتك
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

الحلقة الأولى.

الحلقة الثانية - الجزء الأول.

الحلقة الثانية - الجزء الثاني.

الحلقة الثانية - الجزء الثالث.

الحلقة الثانية - الجزء الرابع.

الحلقة الثانية - الجزء الخامس.

الحلقة الثانية - الجزء السادس و الأخير.

الحلقة الثالثة - الجزء الأول.

الحلقة الثالثة - الجزء الثاني.

الحلقة الثالثة - الجزء الثالث.

الحلقة الثالثة - الجزء الرابع.

الحلقة الثالثة - الجزء الخامس و الأخير.

الحلقة الرابعة - الجزء الأول.

الحلقة الرابعة - الجزء الثاني.

الحلقة الرابعة - الجزء الثالث.

الحلقة الرابعة - الجزء الرابع.

الحلقة الرابعة - الجزء الخامس.

الحلقة الرابعة - الجزء السادس.

الحلقة الرابعة - الجزء السابع.

الحلقة الرابعة - الجزء الثامن.

الحلقة الرابعة - الجزء التاسع.

الحلقة الرابعة - الجزء العاشر.

الحلقة الرابعة - الجزء الحادي عشر.

الحلقة الرابعة - الجزء الثاني عشر.

الحلقة الرابعة - الجزء الثالث عشر.

الحلقة الرابعة - الجزء الرابع عشر.

الحلقة الرابعة - الجزء الخامس عشر.

الحلقة الرابعة - الجزء السادس عشر.

مرحبا بكم إخوتي الكرام في الجزء السابع عشر من الحلقة الرابعة من سلسلة اختبر قدراتك, قمتُ بتقسيم الحلقة الرابعة إلى عدة أجزاء, مُرتبة حسب الصعوبة.

أجزاء هذه الحلقة ستكون خاصة بمسائل الــ OOP.

الإختبار الرابع (الجزء السابع عشر) :

ما هي مُخرجات الكود التالي : (يُمنع استخدام الــ Compiler)

#include <iostream>
using namespace std;

class erreur {
public:
    int num;
};

class erreur_d : public erreur {
public:
    int code;
};

class A {
public:

    A(int n) {
        if (n == 1) {
            erreur_d erd;
            erd.num = 999;
            erd.code = 12;
            throw erd;
        }
    }
};

int main() {
    try {
        A a(1);
        cout << "apres creation a(1)" << endl;
    } catch (erreur er) {
        cout << "exception erreur : " << er.num << endl;
    } catch (erreur_d erd) {
        cout << "exception erreur_d : " << erd.num << " " << erd.code << endl;
    }

    cout << "suite" << endl;

    try {
        A b(1);
        cout << "apres creation b(1)" << endl;
    } catch (erreur_d erd) {
        cout << "exception erreur_d : " << erd.num << " " << erd.code << endl;
    } catch (erreur er) {
        cout << "exception erreur : " << er.num << endl;
    }

    return 0;
}

علل إجابتك.

سأضع حل السؤال بعد إنتهاء عرض المحاولات.

#2

لست بارعاً في الوراثة ولكن وحسب القاعدة الأساسية في الوراثة : الابن "هو" الأب ...فعند رمي كائن من الابن فهو كائن من الأب أيضاً ...

أي أن كل العبارات ستتحقق ولكن الcatch التي ستأتي أولاً ستنفذ ولن تنفذ الcatch الثانية(هذا مع قلة تعاملي مع الاستثناءات)

وستكون مخرجات الكود ..

apres creation a(1)
exception erreur : 999
suite
apres creation b(1)
exception erreur_d : 999 12

والحمد لله رب العالمين

#3
apres creation a(1)
exception erreur :   999
suite
apres creation b(1)
exception erreur_d : 999

مجرد تخمين, فو نفس تفسير مصطفى :lol:

[سبحان الله و بحمده, سبحان الله العظيم]

#4

المُخرجات الصحيحة هي :

exception erreur : 999

suite

exception erreur_d : 999 12

في الــ bloc الأول التابع لــ try, إنشاء الكائن a(1) نتج عنه استثناء من نوع erreur_d.

قيمة num و code (التابعتان لــ erd) هما على التوالي 999 و 12.

الــ catch الأولى مناسبة لأن erreur عبارة عن basic type من erreur_d و هذا ما يُفسر عدم ظهور قيمة الــ code في المرة الأولى.

في الــ bloc الثاني التابع لــ try, توجد نفس الــ catch لكن بصورة عكسية. الإستثناء الذي نتج عن إنشاء b تتم معالجته من طرف الــ catch المناسب, في هذه الحالة ستظهر قيمة الــ code.

هذا الموضوع مغلق.

مواضيع مشابهة