مراجعة - مدير المصفوفات الديناميكية
جزء من قسم البرمجة كائنية التوجه في رحلة C++ على Coddy. الدرس 17 من 104.
التحدي
سهللنَبْنِ فئة DynamicArray تدير ذاكرتها بنفسها، وتنمو تلقائيًا عند الحاجة، تمامًا كما تعمل std::vector داخليًا!
ستُنشئ ملفين لتنظيم التعليمات البرمجية الخاصة بك:
DynamicArray.h: عرّف فئةDynamicArrayتدير مصفوفة ذات حجم ديناميكي من الأعداد الصحيحة. يجب أن تحتوي فئتك على:- أعضاء خاصة: مؤشر إلى مصفوفة البيانات، وcurrent size (عدد elements)، وcapacity (المساحة المخصّصة)
- منشئ يأخذ initial capacity، ويخصّص المصفوفة على الكومة، ويُهيّئ size إلى 0
- مُدمّر يحرّر الذاكرة المخصّصة ويطبع
"DynamicArray destroyed" - طريقة
push(int value)تضيف عنصرًا إلى المصفوفة. إذا كانت المصفوفة ممتلئة، فيجب أن تضاعف capacity عن طريق تخصيص مصفوفة جديدة أكبر، وCopying العناصر existing، وتحرير المصفوفة القديمة - طريقة
get(size_t index)تُرجع العنصر عند given index - طريقة
getSize()تُرجع العدد current من elements - طريقة
getCapacity()تُرجع current capacity
main.cpp: اقرأ capacity initial وعددًا من القيم المطلوب إضافتها. ثم اقرأ ذلك العدد من قيم الأعداد الصحيحة وأضف كل قيمة منها إلى DynamicArray الخاصة بك. بعد إضافة جميع القيم، اطبع:"Size: <size>""Capacity: <capacity>""Elements: <e1> <e2> ..."(جميع elements مفصولة بمسافات)
سيكون تنسيق الإدخال كما يلي:
- السطر الأول: capacity initial (عدد صحيح)
- السطر الثاني: عدد القيم المطلوب إضافتها (عدد صحيح)
- الأسطر التالية: قيمة عدد صحيح واحدة في كل سطر
عند تغيير الحجم، يجب أن تضاعف المصفوفة capacity الخاص بها. على سبيل المثال، إذا بدأت بسعة 2 وأضفت عنصرًا ثالثًا، فيجب أن تصبح capacity هي 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: Create a DynamicArray with the initial capacity
// TODO: اقرأ numValues أعدادًا صحيحة وادفع كلًا منها إلى المصفوفة
// TODO: اطبع "Size: <size>"
// TODO: اطبع "Capacity: <capacity>"
// TODO: اطبع "Elements: <e1> <e2> ..." (جميع العناصر مفصولة بمسافات)
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++ عبر الإنترنت