مراجعة - الحاويات العامة
جزء من قسم البرمجة كائنية التوجه في رحلة C++ على Coddy. الدرس 69 من 104.
التحدي
سهللننشئ قالب فئة GenericContainer يجمع كل ما تعلمته عن القوالب في هذا الفصل. ستنشئ حاوية مرنة وآمنة من حيث الأنواع، يمكنها تخزين العناصر ديناميكيًا وتوفير عمليات مفيدة باستخدام تقنيات القوالب.
ستنظم شيفرتك في ملفين:
GenericContainer.h: عرّف قالب الفئة هنا. ينبغي أن تقومGenericContainerبما يلي:تخزين العناصر ديناميكيًا باستخدام مؤشر إلى مصفوفة، مع تتبّع الحجم الحالي والسعة.
توفير هذه الدوال الأساسية:
- مُنشئ يأخذ سعة ابتدائية
- مُدمّر يحرر الذاكرة الديناميكية على النحو الصحيح
push(T value): يضيف عنصرًا إلى الحاوية (افترض أن السعة كافية دائمًا في هذا التحدي)get(size_t index): يعيد العنصر عند الفهرس المحددgetSize(): يعيد العدد الحالي للعناصر
أضف قالب دالة باسم
printContainerيأخذGenericContainer<T>&ويطبع جميع العناصر مفصولة بمسافات، ثم يطبع سطرًا جديدًا.أنشئ تخصيصًا لقالب
printContainerمن أجلGenericContainer<bool>، بحيث يطبعtrueأوfalseبدلًا من1أو0.أضف قالب دالة متغير الوسائط باسم
pushAllيأخذGenericContainer<T>&وأي عدد من القيم، ويدفع كل قيمة إلى الحاوية باستخدام تعبير الطي. يكرّر الطي على عامل الفاصلة، مثل(container.push(args), ...);، تنفيذ الاستدعاء مرة واحدة لكل وسيطة.main.cpp: اقرأ خمس قيم إدخال (كل قيمة في سطر منفصل):- العدد الصحيح الأول
- العدد الصحيح الثاني
- العدد الصحيح الثالث
- قيمة من نوع double
- قيمة منطقية على هيئة سلسلة نصية (
trueأوfalse)
وضّح عمل الحاوية من خلال:
- إنشاء
GenericContainer<int>بسعة 10 - استخدام
pushAllلإضافة الأعداد الصحيحة الثلاثة دفعة واحدة - طباعة الحجم:
Int container size: <size> - استدعاء
printContainerلعرض الأعداد الصحيحة - إنشاء
GenericContainer<double>بسعة 5 - دفع قيمة double والقيمة الحرفية
2.5باستخدام استدعاءات منفردة لـpush - استدعاء
printContainerلعرض قيم double - إنشاء
GenericContainer<bool>بسعة 5 - دفع قيمة الإدخال المنطقية والقيمة الحرفية
false - استدعاء
printContainerلعرض القيم المنطقية (ينبغي أن يعرضtrue/false)
على سبيل المثال، عند إدخال 10 و20 و30 و3.14 وtrue:
Int container size: 3
10 20 30
3.14 2.5
true false يجمع هذا التحدي بين قوالب الفئات الخاصة بالحاوية، وتخصيص القوالب لطباعة القيم المنطقية بطريقة مخصصة، وقوالب متغيرة الوسائط للدالة المرنة 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;
// حوّل السلسلة النصية إلى 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: أضف قيمة الإدخال المنطقية وfalse
// TODO: استدعِ printContainer لعرض القيم المنطقية
return 0;
}
جميع دروس البرمجة كائنية التوجه
1أساسيات الـ OOP
الملفات الخارجيةبناء وتجميع (Compilation) لغة C++ملفات الـ Header وملفات الـ Sourceالـ Namespaces والـ Scopeمقدمة في الـ OOP في C++الـ Classes مقابل الـ Objectsالمؤشر 'this'الـ Methods (الدوال الأعضاء)الـ Attributes (بيانات الأعضاء)أساسيات الـ Ctors والـ Dtorsمراجعة - آلة حاسبة بسيطة4خصائص الـ Class
أعضاء الـ Instance مقابل الـ Staticدوال الـ Getters والـ Settersدوال الأعضاء الثابتة (Const)الكلمة المفتاحية Mutableالدوال والمتغيرات الساكنة (Static)الدوال والفئات الصديقة (Friend)مراجعة - مدير الحساب البنكي7الوراثة
الوراثة الأساسيةمستويات الوصول في الوراثةترتيب استدعاء الـ Ctor والـ Dtorإعادة تعريف الدوال (Method Overriding)الدوال الافتراضية والـ VTableالوراثة المتعددةالوراثة الافتراضيةمراجعة - هيكلية الموظفين10نظرة عامة على STL
نظرة عامة وفلسفة STLحاويات STLالـ Iteratorsخوارزميات STLالـ Functors وتعبيرات Lambdaمراجعة - تكرار الكلمات13أنماط التصميم - الجزء الأول
مقدمة في أنماط التصميمنمط Singletonنمط Factory و Abstract Factoryنمط Builderنمط Observerنمط Strategy2إدارة الذاكرة
ذاكرة Stack مقابل Heapالمؤشرات والمراجعالذاكرة الديناميكية (new/delete)المؤشرات الذكية في C++RAII في C++مراجعة - مدير المصفوفات الديناميكية5التغليف (Encapsulation)
محددات الوصول في C++محددات الوصول بشكل متعمقإخفاء المعلوماتStruct مقابل Classالأصناف المتداخلة والداخليةمراجعة - نظام سجلات الطلاب8تعدد الأشكال (Polymorphism)
تعدد الأشكال: وقت التجميع مقابل وقت التشغيلالتحميل الزائد للدوال (Function Overloading)مراجعة الدوال الافتراضية (Virtual Functions)الدوال الافتراضية البحتة (Pure Virtual Functions)الأصناف المجردة (Abstract Classes)تصميم الواجهات (Interface) في C++التحويل الديناميكي (Dynamic Casting) و RTTIملخص - حاسبة الأشكال11مفاهيم OOP المتقدمة
التركيب مقابل الوراثةالـ Mixins عبر CRTPنمط Pimplمحو النوع (Type Erasure)أصناف Enum والأنواع القويةمعالجة الاستثناءات في OOPتسلسلات الاستثناءات المخصصة14أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط قالب الطريقةنمط الحالةنمط التركيبRAII كنمط3المنشئات والموادم
المنشئ الافتراضيالمنشئ ذو المعاملاتمنشئ النسخمنشئ النقلقوائم تهيئة المنشئالمنشئات المفوضةتعمق في الموادمقاعدة الثلاثة / الخمسة / الصفرمراجعة - فئة String6تحميل العوامل (Operator Overloading)
مقدمة في تحميل العواملتحميل العوامل الحسابيةتحميل عوامل المقارنةعوامل Streamتحميل عامل التعيينتحميل العوامل [] و ()عوامل تحويل النوعمراجعة - Matrix Class9القوالب
قوالب الدوالقوالب الأصنافتخصيص القوالبالقوالب المتغيرةأساسيات SFINAE و Type Traitsمراجعة - الحاويات العامةتدرّب بنفسك: مترجم C++ عبر الإنترنت