مراجعة - مدير المصفوفات الديناميكية
جزء من قسم Object Oriented Programming في رحلة C++ على Coddy — الدرس 17 من 104.
التحدي
سهللنقم ببناء فئة DynamicArray تدير ذاكرتها الخاصة، وتنمو تلقائيًا عند الحاجة — تمامًا كما تعمل std::vector في الكواليس!
ستقوم بإنشاء ملفين لتنظيم الكود الخاص بك:
DynamicArray.h: قم بتعريف فئةDynamicArrayتدير مصفوفة أعداد صحيحة ذات حجم ديناميكي. يجب أن تحتوي الفئة الخاصة بك على:- أعضاء خاصة (Private members): مؤشر إلى مصفوفة البيانات، الحجم الحالي (عدد العناصر)، والسعة (المساحة المحجوزة).
- منشئ (Constructor) يأخذ سعة أولية، ويخصص المصفوفة في الذاكرة (heap)، ويهيئ الحجم إلى 0.
- مدمر (Destructor) يحرر الذاكرة المخصصة ويطبع
"DynamicArray destroyed". - طريقة
push(int value)تضيف عنصرًا إلى المصفوفة. إذا كانت المصفوفة ممتلئة، يجب أن تضاعف السعة عن طريق تخصيص مصفوفة جديدة أكبر، ونسخ العناصر الموجودة، وتحرير المصفوفة القديمة. - طريقة
get(size_t index)تعيد العنصر الموجود في الفهرس المعطى. - طريقة
getSize()تعيد العدد الحالي للعناصر. - طريقة
getCapacity()تعيد السعة الحالية.
main.cpp: اقرأ السعة الأولية وعدد القيم المراد إضافتها. ثم اقرأ هذا العدد من قيم الأعداد الصحيحة وقم بإضافة كل منها إلى DynamicArray الخاص بك. بعد إضافة جميع القيم، اطبع:"Size: <size>""Capacity: <capacity>""Elements: <e1> <e2> ..."(جميع العناصر مفصولة بمسافات)
تنسيق الإدخال سيكون:
- السطر الأول: السعة الأولية (عدد صحيح)
- السطر الثاني: عدد القيم المراد إضافتها (عدد صحيح)
- الأسطر التالية: قيمة عدد صحيح واحدة في كل سطر
عند تغيير الحجم، يجب أن تضاعف المصفوفة سعتها. على سبيل المثال، إذا بدأت بسعة 2 وأضفت عنصرًا ثالثًا، يجب أن تصبح السعة 4. هذا يوضح مبدأ RAII — حيث تكتسب الفئة الخاصة بك الذاكرة في المنشئ وتطلقها في المدمر، مما يضمن عدم وجود تسرب للذاكرة.
قم بتضمين ملف الترويسة الخاص بك في main.cpp باستخدام #include "DynamicArray.h".
جرّب بنفسك
#include <iostream>
#include "DynamicArray.h"
using namespace std;
int main() {
// قراءة السعة الأولية
int initialCapacity;
cin >> initialCapacity;
// قراءة عدد القيم المراد إضافتها
int numValues;
cin >> numValues;
// TODO: إنشاء DynamicArray بالسعة الأولية
// TODO: قراءة numValues من الأعداد الصحيحة وإضافتها (push) إلى المصفوفة
// TODO: طباعة "Size: <size>"
// TODO: طباعة "Capacity: <capacity>"
// TODO: طباعة "Elements: <e1> <e2> ..." (جميع العناصر مفصولة بمسافات)
return 0;
}
جميع دروس Object Oriented Programming
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مراجعة - الحاويات العامة