סיכום – מכל גנרי
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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>&ומספר כלשהו של ערכים, ודוחפת כל אחד מהם למכל באמצעות ביטוי קיפול.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 האתגר הזה משלב תבניות מחלקה עבור המכל, התמחות תבנית להדפסה מותאמת אישית של ערכי 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;
// המירו מחרוזת ל-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
קבצים חיצונייםבנייה וקומפילציה של 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++ אונליין