Menu
Coddy logo textTech

סיכום – מכל גנרי

חלק מהיחידה תכנות מונחה עצמים במסלול ה-C++ של Coddy. שיעור 69 מתוך 104.

challenge icon

אתגר

קל

בואו נבנה תבנית מחלקה 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: קרא חמישה קלטים (כל אחד בשורה נפרדת):
    1. המספר השלם הראשון
    2. המספר השלם השני
    3. המספר השלם השלישי
    4. ערך double
    5. ערך בוליאני כמחרוזת (true או false)

    הדגם את המכל שלך כך:

    1. צור GenericContainer<int> עם קיבולת 10
    2. השתמש ב-pushAll כדי להוסיף את כל שלושת המספרים השלמים בבת אחת
    3. הדפס את הגודל: Int container size: <size>
    4. קרא ל-printContainer כדי להציג את המספרים השלמים
    5. צור GenericContainer<double> עם קיבולת 5
    6. דחוף את ערך ה-double ואת הערך המילולי 2.5 באמצעות קריאות נפרדות ל-push
    7. קרא ל-printContainer כדי להציג את ערכי ה-double
    8. צור GenericContainer<bool> עם קיבולת 5
    9. דחוף את הקלט הבוליאני ואת הערך המילולי false
    10. קרא ל-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;
}

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר C++ אונליין