Menu
Coddy logo textTech

בנאי עם פרמטרים

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

בנאי עם פרמטרים מקבל ארגומנטים שמאפשרים לך לאתחל אובייקט עם ערכים מסוימים בזמן יצירתו. במקום להסתמך על ערכי ברירת מחדל, אפשר להתאים אישית את המצב ההתחלתי של כל אובייקט.

class Player {
    std::string name;
    int health;
    int level;
public:
    Player(std::string n, int h, int lvl) {
        name = n;
        health = h;
        level = lvl;
    }
};

Player hero("Archer", 100, 5);
Player mage("Wizard", 80, 7);

אפשר להגדיר כמה בנאים עם פרמטרים ועם רשימות פרמטרים שונות. הדבר נקרא העמסת בנאים, והמהדר בוחר את הבנאי המתאים על סמך הארגומנטים שסיפקת.

class Rectangle {
    int width, height;
public:
    Rectangle(int side) {          // ריבוע
        width = height = side;
    }
    
    Rectangle(int w, int h) {      // מלבן
        width = w;
        height = h;
    }
};

Rectangle square(10);        // קורא לבנאי הראשון
Rectangle rect(10, 20);      // קורא לבנאי השני

לפרמטרים יכולים להיות ערכי ברירת מחדל, וכך חלק מהארגומנטים הופכים לאופציונליים. הדבר מפחית את הצורך במספר בנאים בעלי העמסה יתרה.

class Enemy {
    std::string type;
    int damage;
public:
    Enemy(std::string t, int d = 10) : type(t), damage(d) {}
};

Enemy goblin("Goblin");       // הערך של damage הוא 10 כברירת מחדל
Enemy dragon("Dragon", 50);   // הערך של damage נקבע ל-50

זכור מהשיעור הקודם: ברגע שמגדירים בנאי עם פרמטרים, המהדר כבר לא יוצר בנאי ברירת מחדל באופן אוטומטי. אם צריך את שניהם, יש להגדיר את בנאי ברירת המחדל במפורש.

challenge icon

אתגר

קל

בואו נבנה מערכת לניהול מלאי מוצרים שמדגימה כיצד בנאים עם פרמטרים מאפשרים ליצור אובייקטים עם ערכים התחלתיים מסוימים, וכיצד העמסת בנאים מספקת גמישות ביצירת אובייקטים.

תיצרו שני קבצים כדי לארגן את הקוד:

  • Product.h: הגדירו מחלקה בשם Product שמייצגת פריטים במלאי. למחלקה צריכים להיות:
    • מאפיינים פרטיים עבור name (מחרוזת), price (מספר ממשי) ו-quantity (מספר שלם)
    • בנאי שמקבל את שלושת הפרמטרים (name, price, quantity) כדי לאתחל מוצר באופן מלא
    • בנאי שמקבל רק name ו-price, כאשר quantity מקבל כברירת מחדל את הערך 1
    • בנאי שמקבל רק name, כאשר price מקבל כברירת מחדל את הערך 0.0 ו-quantity מקבל כברירת מחדל את הערך 0
    • מתודה display() שמדפיסה את פרטי המוצר בפורמט: "<name>: $<price> (x<quantity>)"
    • מתודה getTotalValue() שמחזירה את המחיר כפול הכמות
  • main.cpp: הדגימו את שלושת הבנאים באמצעות קריאת קלט ויצירת מוצרים בדרכים שונות. קראו מהקלט את הפרטים הבאים:
    • שורה ראשונה: שם מוצר, מחיר וכמות (מופרדים ברווחים)
    • שורה שנייה: שם מוצר ומחיר (מופרדים ברווחים)
    • שורה שלישית: שם מוצר בלבד
    צרו שלושה אובייקטים מסוג Product באמצעות הבנאי המתאים לכל קלט, קראו ל-display() עבור כל אחד מהם, ואז הדפיסו את הערך הכולל של שלושת המוצרים יחד בפורמט: "Total inventory value: $<value>"

בהצגת המחיר, הציגו שתי ספרות אחרי הנקודה העשרונית. לדוגמה, אם תיצרו מוצר בשם "Laptop" במחיר 999.99 ובכמות 5, התצוגה צריכה להציג "Laptop: $999.99 (x5)".

כללו את קובץ הכותרת ב-main.cpp באמצעות #include "Product.h".

נסו בעצמכם

#include <iostream>
#include <iomanip>
#include <string>
#include "Product.h"

using namespace std;

int main() {
    // קרא את המוצר הראשון: שם, מחיר וכמות
    string name1;
    double price1;
    int quantity1;
    cin >> name1 >> price1 >> quantity1;
    
    // קרא את המוצר השני: שם ומחיר
    string name2;
    double price2;
    cin >> name2 >> price2;
    
    // קרא את המוצר השלישי: שם בלבד
    string name3;
    cin >> name3;
    
    // TODO: צור שלושה אובייקטים מסוג Product באמצעות הבנאי המתאים לכל אחד
    
    // TODO: קרא ל-display() עבור כל מוצר
    
    // TODO: חשב והדפס את הערך הכולל של המלאי
    // פורמט: "Total inventory value: $<value>"
    // השתמש ב-fixed וב-setprecision(1) כדי להציג ספרה אחת אחרי הנקודה העשרונית
    
    return 0;
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

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

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