Menu
Coddy logo textTech

בנאים מאצילים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-C++ של Coddy. שיעור 23 מתוך 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(std::string n) : Player(n, 100, 1) {}
    
    // גם בנאי ברירת המחדל מעביר את הביצוע
    Player() : Player("Unknown") {}
};

ההאצלה מתבצעת ברשימת האתחול באמצעות שם המחלקה ואחריו הארגומנטים. כשקוראים ל־Player(), היא מאצילה ל־Player(std::string), שבתורה מאצילה לבנאי בעל שלושת הפרמטרים. השרשרת מתבצעת מהבנאי היעד בחזרה לבנאי המקורי.

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

class Item {
    int id;
    int value;
public:
    Item(int i, int v) : id(i), value(v) {}
    
    // שגיאה! אי אפשר לשלב האצלה עם אתחול שדות מחלקה
    // Item(int i) : Item(i, 0), id(i) {}
    
    // תקין - האצלה בלבד
    Item(int i) : Item(i, 0) {}
};

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

challenge icon

אתגר

קל

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

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

  • Connection.h: הגדירו מחלקה בשם Connection שמייצגת חיבור רשת עם אפשרויות הגדרה שונות. המחלקה שלכם צריכה לכלול:
    • חברים פרטיים: host (מחרוזת), port (int), timeout (int בשניות) ו-secure (bool)
    • בנאי ראשי שמקבל את כל ארבעת הפרמטרים ומאתחל את כל החברים באמצעות רשימת אתחול. הבנאי הזה צריך להדפיס "Connection configured: <host>:<port>"
    • בנאי שמקבל רק את host ואת port, ומאציל לבנאי הראשי עם ערך ברירת מחדל של 30 עבור timeout וערך ברירת מחדל של false עבור secure
    • בנאי שמקבל רק את host ומאציל לבנאי עם שני הפרמטרים, עם ערך ברירת מחדל של 80 עבור port
    • בנאי ברירת מחדל שמאציל לבנאי עם פרמטר אחד, עם ערך ברירת מחדל של "localhost" עבור host
    • מתודת getInfo() שמחזירה מחרוזת בתבנית: "<host>:<port> (timeout: <timeout>s, secure: <yes/no>)"
  • main.cpp: הדגימו את שרשרת ההאצלה באמצעות יצירת חיבורים עם בנאים שונים. קראו מהקלט שם מארח ומספר יציאה (כל אחד בשורה נפרדת), ואז:
    • צרו Connection באמצעות בנאי ברירת המחדל
    • צרו Connection באמצעות שם המארח בלבד מתוך הקלט
    • צרו Connection באמצעות שם המארח ומספר היציאה מתוך הקלט
    • צרו Connection עם שם המארח מהקלט, מספר היציאה מהקלט, ערך timeout של 60 והגדרה של true עבור secure
    • הדפיסו את getInfo() עבור כל חיבור, אחד בכל שורה

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

עבור מצב האבטחה ב-getInfo(), הדפיסו "yes" אם secure הוא true, ואחרת הדפיסו "no".

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

נסו בעצמכם

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

using namespace std;

int main() {
    // קרא את הקלט
    string host;
    int port;
    cin >> host;
    cin >> port;

    // TODO: צור Connection באמצעות בנאי ברירת המחדל

    // TODO: צור Connection באמצעות host בלבד מהקלט

    // TODO: צור Connection באמצעות host ו-port מהקלט

    // TODO: צור Connection עם host ו-port מהקלט, timeout=60, secure=true

    // TODO: הדפס את getInfo() עבור כל חיבור, אחד בכל שורה

    return 0;
}
quiz iconבחנו את עצמכם

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

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

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