Menu
Coddy logo textTech

סיכום – מחלקת String

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

challenge icon

אתגר

קל

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

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

  • String.h: הגדירו את המחלקה String שלכם בהתאם לכלל חמשת הכללים. המחלקה שלכם צריכה לנהל מצביע char* בשם data ואיבר size_t length. ממשו:
    • בנאי ברירת מחדל שיוצר מחרוזת ריקה (הקצו תו יחיד לתו סיום null, הגדירו את האורך ל-0). הדפיסו "Default constructed"
    • בנאי עם פרמטרים שמקבל const char* ומעתיק את מחרוזת ה-C לזיכרון שהוקצה לאחרונה. הדפיסו "Constructed: <text>"
    • בנאי העתקה שמבצע העתקה עמוקה של אובייקט String אחר. הדפיסו "Copied: <text>"
    • בנאי העברה (מסומן ב-noexcept) שמעביר את הבעלות. הדפיסו "Moved: <text>" תוך שימוש בטקסט לפני איפוס המקור
    • הורס שמשחרר את הזיכרון בבטחה (בדקו אם הוא null). הדפיסו "Destroyed: <text>" (הדפיסו "Destroyed: (empty)" אם data הוא null או אם האורך הוא 0)
    • מתודת size() שמחזירה את האורך
    • מתודת c_str() שמחזירה את מצביע התווים (החזירו "" אם הוא null)
  • main.cpp: הדגימו כיצד כל הבנאים פועלים יחד. קראו מחרוזת טקסט מהקלט, ואז:
    • צרו String בשם s1 באמצעות בנאי ברירת המחדל
    • צרו String בשם s2 עם טקסט הקלט
    • צרו String בשם s3 על ידי העתקת s2
    • צרו String בשם s4 על ידי העברה מתוך s2
    • הדפיסו "--- Status ---"
    • עבור כל מחרוזת (s1 עד s4), הדפיסו "s<n>: \"<text>\" (length: <len>)"

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

כללו את <cstring> עבור strlen ו-strcpy, ואת <utility> עבור std::move(). אל תשכחו להוסיף guards לכותרת בקובץ הכותרת שלכם.

נסו בעצמכם

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

using namespace std;

int main() {
    string input;
    getline(cin, input);

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

    // TODO: צרו את String s2 עם טקסט הקלט

    // TODO: צרו את String s3 באמצעות העתקת s2

    // TODO: צרו את String s4 באמצעות העברה מ־s2 (השתמשו ב־std::move)

    // הדפיסו כותרת מצב
    cout << "--- Status ---" << endl;

    // TODO: הדפיסו את המצב של כל מחרוזת מ־s1 עד s4
    // פורמט: "s<n>: \"<text>\" (length: <len>)"

    return 0;
}

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

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