Menu
Coddy logo textTech

חברי מופע לעומת חברים סטטיים

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

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

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

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

class Player {
    std::string name;           // שדה של מופע - לכל שחקן יש שדה משלו
    int health;                 // שדה של מופע
    
    static int playerCount;     // שדה סטטי - משותף לכל השחקנים
    
public:
    Player(std::string n) : name(n), health(100) {
        playerCount++;          // יש להגדיל את הערך כשנוצר שחקן כלשהו
    }
    
    ~Player() {
        playerCount--;          // יש להקטין את הערך כששחקן כלשהו נהרס
    }
};

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

חברי מופעחברים סטטיים
ייחודיים לכל אובייקטמשותפים לכל האובייקטים
נוצרים בעת יצירת האובייקטקיימים לפני יצירת אובייקט כלשהו
ניגשים אליהם דרך אובייקט: player.healthניגשים אליהם דרך מחלקה: Player::playerCount
challenge icon

אתגר

קל

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

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

  • Product.h: הגדירו מחלקת Product שמנהלת מוצרים בודדים ובמקביל עוקבת אחר נתונים של כלל המלאי. המחלקה צריכה לכלול:
    • איברי מופע: name (מחרוזת) ו-price (double): ייחודיים לכל מוצר
    • איבר סטטי totalProducts שסופר כמה מוצרים קיימים כרגע
    • איבר סטטי totalValue שעוקב אחר המחיר הכולל של כל המוצרים
    • בנאי שמקבל שם ומחיר, מאתחל את איברי המופע ומעדכן את שני המונים הסטטיים (מגדיל את המונה ומוסיף את המחיר לערך הכולל)
    • הורס שמעדכן את המונים הסטטיים כאשר מוצר מוסר (מקטין את המונה ומחסיר את מחיר המוצר מהערך הכולל)
    • מתודה getInfo() שמחזירה מחרוזת בפורמט: "<name>: $<price>"
    • מתודה סטטית getInventoryStats() שמחזירה מחרוזת: "Products: <count>, Total Value: $<value>"
  • main.cpp: הדגימו כיצד איברים סטטיים משותפים לכל האובייקטים, בעוד שאיברי מופע נשארים ייחודיים. קראו שני שמות של מוצרים ואת מחיריהם מהקלט (name1, price1, name2, price2: כל אחד בשורה נפרדת), ואז:
    • הדפיסו את נתוני המלאי ההתחלתיים באמצעות שם המחלקה: Product::getInventoryStats()
    • צרו בלוק תחום באמצעות סוגריים מסולסלים ובתוכו צרו Product עם השם והמחיר הראשונים. הדפיסו את הפרטים שלו ואת נתוני המלאי הנוכחיים.
    • לאחר סיום הבלוק (המוצר הראשון הושמד), הדפיסו "After first scope:" ולאחר מכן את נתוני המלאי
    • צרו Product נוסף עם השם והמחיר השניים. הדפיסו את הפרטים שלו ואת נתוני המלאי.
    • צרו Product שלישי עם השם "Bonus" והמחיר 5.00. הדפיסו את נתוני המלאי הסופיים.

זכרו להגדיר את האיברים הסטטיים מחוץ למחלקה בקובץ הכותרת (לאחר הגדרת המחלקה). עצבו את המחירים עם שתי ספרות אחרי הנקודה העשרונית באמצעות std::fixed ו-std::setprecision(2) מתוך <iomanip>.

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

נסו בעצמכם

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

using namespace std;

int main() {
    // קרא את הקלט
    string name1;
    double price1;
    string name2;
    double price2;
    
    getline(cin, name1);
    cin >> price1;
    cin.ignore();
    getline(cin, name2);
    cin >> price2;
    
    // TODO: הדפס את נתוני המלאי ההתחלתיים באמצעות Product::getInventoryStats()
    
    // TODO: צור בלוק תחום באמצעות סוגריים מסולסלים
    // בתוך הבלוק:
    //   - צור אובייקט Product עם name1 ו-price1
    //   - הדפס את המידע שלו באמצעות getInfo()
    //   - הדפס את נתוני המלאי הנוכחיים
    
    // TODO: לאחר סיום הבלוק, הדפס "After first scope:"
    // לאחר מכן הדפס את נתוני המלאי
    
    // TODO: צור אובייקט Product נוסף עם name2 ו-price2
    // הדפס את המידע שלו ואת נתוני המלאי
    
    // TODO: צור אובייקט Product שלישי עם השם "Bonus" והמחיר 5.00
    // הדפס את נתוני המלאי הסופיים
    
    return 0;
}
quiz iconבחנו את עצמכם

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

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

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