סיכום – מנהל מערכים דינמיים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C++ של Coddy. שיעור 17 מתוך 104.
אתגר
קלבואו נבנה מחלקה בשם DynamicArray שמנהלת את הזיכרון שלה בעצמה וגדלה אוטומטית בעת הצורך, בדיוק כמו std::vector מאחורי הקלעים!
תיצרו שני קבצים כדי לארגן את הקוד שלכם:
DynamicArray.h: הגדירו מחלקה בשםDynamicArrayשמנהלת מערך בגודל דינמי של מספרים שלמים. למחלקה שלכם צריכים להיות:- חברים פרטיים: מצביע למערך הנתונים, הגודל הנוכחי (מספר האיברים) והקיבולת (השטח שהוקצה)
- בנאי שמקבל קיבולת התחלתית, מקצה את המערך בערימה ומאתחל את הגודל ל־0
- הורס שמשחרר את הזיכרון שהוקצה ומדפיס
"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 מספרים שלמים והוסף כל אחד מהם למערך
// TODO: הדפס "Size: <size>"
// TODO: הדפס "Capacity: <capacity>"
// TODO: הדפס "Elements: <e1> <e2> ..." (כל האיברים מופרדים ברווחים)
return 0;
}
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות OOP
קבצים חיצונייםבנייה וקומפילציה של C++קובצי Header וקובצי מקורמרחבי שמות והיקףמבוא ל-OOP ב-C++מחלקות לעומת אובייקטיםמצביע thisמתודות (פונקציות איבר)תכונות (חברי נתונים)יסודות הבנאים וההורסיםסיכום – מחשבון פשוט4מאפייני מחלקה
חברי מופע לעומת חברים סטטייםגטרים וסטריםפונקציות איבר קבועותמילת המפתח mutableמתודות ומשתנים סטטייםפונקציות ומחלקות ידידותסיכום – מנהל חשבונות בנק7ירושה
ירושה בסיסיתרמות גישה בירושהסדר הקריאות לבנאי ולמפרקדריסת מתודותפונקציות וירטואליות ו־VTableירושה מרובהירושה וירטואליתסיכום – היררכיית עובדים2ניהול זיכרון
זיכרון Stack לעומת Heapמצביעים והפניותזיכרון דינמי (new/delete)מצביעים חכמים ב-C++RAII ב-C++סיכום – מנהל מערכים דינמיים5כימוס
מצייני גישה ב-C++מצייני גישה לעומקהסתרת מידעמבנה לעומת מחלקהמחלקות מקוננות ופנימיותסיכום – מערכת רשומות תלמידים8רב־צורתיות
רב־צורתיות בזמן קומפילציה לעומת בזמן ריצההעמסת פונקציותפונקציות וירטואליות — מבט נוסףפונקציות וירטואליות טהורותמחלקות מופשטותתכנון ממשקים ב־C++המרה דינמית ו־RTTIסיכום — מחשבון צורות3בנאים והורסים
בנאי ברירת מחדלבנאי עם פרמטריםבנאי העתקהבנאי העברהרשימות אתחול בבנאיםבנאים מאציליםמעמיקים בנושא הורסיםכלל השלושה / החמישה / האפססיכום – מחלקת String6העמסת אופרטורים
מבוא להעמסת אופרטוריםהעמסת אופרטורים אריתמטייםהעמסת אופרטורי השוואהאופרטורי זרםהעמסת אופרטור השמההעמסת האופרטורים [] ו־()אופרטורים להמרת טיפוסיםסיכום – מחלקת Matrix9תבניות
תבניות פונקציהתבניות מחלקההתמחות תבניותתבניות ארגומנטים משתנותיסודות SFINAE ותכונות טיפוסיםסיכום – מכל גנריתרגלו בעצמכם: קומפיילר C++ אונליין