Menu
Coddy logo textTech

אופרטורי זרם

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

אופרטורי ההכנסה (<<) והחילוץ (>>) מאפשרים לך להשתמש במחלקות המותאמות אישית שלך עם std::cout ועם std::cin. בניגוד לאופרטורים שעסקנו בהם עד כה, יש לממש אותם כפונקציות שאינן חברות, משום שהאופרנד השמאלי הוא זרם ולא המחלקה שלך.

class Point {
    int x, y;
    
public:
    Point(int x, int y) : x(x), y(y) {}
    
    // יש להכריז כ־friend כדי לגשת לחברים פרטיים
    friend std::ostream& operator<<(std::ostream& os, const Point& p);
    friend std::istream& operator>>(std::istream& is, Point& p);
};

std::ostream& operator<<(std::ostream& os, const Point& p) {
    os << "(" << p.x << ", " << p.y << ")";
    return os;
}

std::istream& operator>>(std::istream& is, Point& p) {
    is >> p.x >> p.y;
    return is;
}

שני האופרטורים מחזירים הפניה לזרם, ומאפשרים לשרשר פעולות כמו std::cout << p1 << p2. אופרטור ההכנסה מקבל את האובייקט בהפניה מסוג const מכיוון שהוא רק קורא נתונים, ואילו אופרטור החילוץ מקבל הפניה שאינה מסוג const מכיוון שהוא משנה את האובייקט.

עכשיו אפשר להשתמש ב־Point באופן טבעי עם זרמים:

Point p(3, 4);
std::cout << "Location: " << p << std::endl;    // פלט: Location: (3, 4)

Point p2(0, 0);
std::cin >> p2;    // קרא שני מספרים שלמים לתוך p2
challenge icon

אתגר

קל

בואו נבנה מחלקה Temperature שאפשר להשתמש בה באופן חלק עם std::cout ועם std::cin באמצעות העמסת אופרטורים של זרמים. זהו תרחיש מעשי שבו רוצים להציג טמפרטורות בפורמט קריא ולקלוט אותן באופן טבעי.

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

  • Temperature.h: הגדירו מחלקה Temperature ששומרת ערך של טמפרטורה (בתור double) ותווית יחידה (בתור char, או 'C' עבור צלזיוס או 'F' עבור פרנהייט). המחלקה צריכה לכלול:
    • איברים פרטיים עבור ערך הטמפרטורה והיחידה
    • בנאי ברירת מחדל שמאתחל ל־0.0 מעלות צלזיוס
    • בנאי עם פרמטרים שמקבל ערך ויחידה
    • פונקציות הגישה getValue() ו־getUnit() (שתיהן const)
    • הצהרות friend עבור אופרטורי ההכנסה (<<) וההוצאה (>>) של זרמים

    ממשו את אופרטורי הזרמים כפונקציות שאינן איברים במחלקה:

    • אופרטור ההכנסה צריך להציג את הטמפרטורה בפורמט VALUE UNIT (למשל, 25.5 C או 77.9 F). השתמשו בספרה אחת אחרי הנקודה העשרונית עבור הערך.
    • אופרטור ההוצאה צריך לקרוא ערך ותו יחידה מהזרם ולאחסן אותם באובייקט Temperature.

    שני האופרטורים חייבים להחזיר הפניה לזרם כדי לאפשר שרשור.

  • main.cpp: קראו שתי טמפרטורות מהקלט. כל טמפרטורה מופיעה בשורה נפרדת בפורמט value unit (למשל, 25.5 C).

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

    Temperature 1: <temp1>
    Temperature 2: <temp2>

    לדוגמה, אם הקלט הוא:

    25.5 C
    98.6 F

    הפלט צריך להיות:

    Temperature 1: 25.5 C
    Temperature 2: 98.6 F

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

נסו בעצמכם

#include <iostream>
#include "Temperature.h"

int main() {
    // TODO: צרו שני אובייקטים מסוג Temperature
    
    // TODO: השתמשו באופרטור החילוץ (>>) כדי לקרוא שתי טמפרטורות מ־std::cin
    
    // TODO: הציגו את הטמפרטורות באמצעות אופרטור ההכנסה (<<)
    // תבנית:
    // Temperature 1: <temp1>
    // Temperature 2: <temp2>
    
    return 0;
}
quiz iconבחנו את עצמכם

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

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

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