Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مراجعة - الحاويات العامة

جزء من قسم Object Oriented Programming في رحلة C++ على Coddy — الدرس 69 من 104.

challenge icon

التحدي

سهل

لنقم ببناء قالب فئة GenericContainer يجمع كل ما تعلمته عن القوالب (templates) في هذا الفصل. ستقوم بإنشاء حاوية مرنة وآمنة من حيث النوع (type-safe) يمكنها تخزين العناصر ديناميكيًا وتوفير عمليات مفيدة من خلال تقنيات القوالب.

ستقوم بتنظيم الكود الخاص بك عبر ملفين:

  • GenericContainer.h: قم بتعريف قالب الفئة الخاص بك هنا. يجب أن يقوم GenericContainer بما يلي:

    تخزين العناصر ديناميكيًا باستخدام مؤشر إلى مصفوفة، مع تتبع الحجم الحالي والسعة.

    توفير هذه الأساليب (methods) الأساسية:

    • منشئ (constructor) يأخذ السعة الأولية
    • مدمر (destructor) يقوم بتنظيف الذاكرة الديناميكية بشكل صحيح
    • push(T value) — يضيف عنصرًا إلى الحاوية (افترض أن السعة كافية دائمًا لهذا التحدي)
    • get(size_t index) — يعيد العنصر الموجود في الفهرس المعطى
    • getSize() — يعيد العدد الحالي للعناصر

    أضف قالب دالة يسمى printContainer يأخذ GenericContainer<T>& ويطبع جميع العناصر مفصولة بمسافات، متبوعة بسطر جديد.

    قم بإنشاء تخصص قالب (template specialization) لـ printContainer من أجل GenericContainer<bool> يطبع true أو false بدلاً من 1 أو 0.

    أضف قالب دالة متغير (variadic function template) يسمى pushAll يأخذ GenericContainer<T>& وأي عدد من القيم، ويقوم بدفع كل واحدة منها إلى الحاوية باستخدام تعبير الطي (fold expression).

  • main.cpp: اقرأ خمسة مدخلات (كل منها في سطر منفصل):
    1. العدد الصحيح الأول
    2. العدد الصحيح الثاني
    3. العدد الصحيح الثالث
    4. قيمة double
    5. قيمة منطقية (boolean) كسلسلة نصية (true أو false)

    قم باستعراض الحاوية الخاصة بك من خلال:

    1. إنشاء GenericContainer<int> بسعة 10
    2. استخدام pushAll لإضافة جميع الأعداد الصحيحة الثلاثة دفعة واحدة
    3. طباعة الحجم: Int container size: <size>
    4. استدعاء printContainer لعرض الأعداد الصحيحة
    5. إنشاء GenericContainer<double> بسعة 5
    6. دفع قيمة double والقيمة الثابتة 2.5 باستخدام استدعاءات push فردية
    7. استدعاء printContainer لعرض قيم double
    8. إنشاء GenericContainer<bool> بسعة 5
    9. دفع المدخل المنطقي والقيمة الثابتة false
    10. استدعاء printContainer لعرض القيم المنطقية (يجب أن تظهر true/false)

على سبيل المثال، مع المدخلات 10، 20، 30، 3.14، و true:

Int container size: 3
10 20 30 
3.14 2.5 
true false 

يجمع هذا التحدي بين قوالب الفئات للحاوية، وتخصص القوالب لطباعة bool المخصصة، والقوالب المتغيرة لدالة pushAll المرنة. تدير حاويتك ذاكرتها الخاصة باتباع مبادئ RAII، مما يوضح كيفية تكامل القوالب مع الإدارة السليمة للموارد.

جرّب بنفسك

#include <iostream>
#include <string>
#include "GenericContainer.h"

using namespace std;

int main() {
    // قراءة المدخلات
    int num1, num2, num3;
    double doubleVal;
    string boolStr;
    
    cin >> num1;
    cin >> num2;
    cin >> num3;
    cin >> doubleVal;
    cin >> boolStr;
    
    // تحويل string إلى bool
    bool boolVal = (boolStr == "true");
    
    // TODO: إنشاء GenericContainer<int> بسعة 10
    
    // TODO: استخدام pushAll لإضافة جميع الأعداد الصحيحة الثلاثة دفعة واحدة
    
    // TODO: طباعة الحجم: "Int container size: <size>"
    
    // TODO: استدعاء printContainer لعرض الأعداد الصحيحة
    
    // TODO: إنشاء GenericContainer<double> بسعة 5
    
    // TODO: إضافة قيمة double و 2.5 باستخدام استدعاءات push فردية
    
    // TODO: استدعاء printContainer لعرض قيم double
    
    // TODO: إنشاء GenericContainer<bool> بسعة 5
    
    // TODO: إضافة مدخل boolean و false
    
    // TODO: استدعاء printContainer لعرض قيم boolean
    
    return 0;
}

جميع دروس Object Oriented Programming