פורסם 2006 באפריל 2119 שנים שאלה בה אני צריכה לבנות מחלקה למחרוזת:בקובץ ההצהרה: ב-private יהיה שדה מסוג char המכיל 256 בייתים.בpublic צריך להיות: Default constructor copy constructor setString getStringאיך אני מממשת כל אחת מהפונקציות הנ"ל בקובץ המימוש?????ובכלל, באיזו פונקציה קולטים את המחרוזת מהמשתמש?תודה.
פורסם 2006 באפריל 2119 שנים לא ממש ברור לי מה לא הבנת. אם זה 'מה' לכתוב במימוש הפונקציות, או 'איך' להגדיר אותן.ממה שכתבת, אין פונקציה שקוראת מחרוזת מהמשתמש. (זה לא חלק מהמחלקה)
פורסם 2006 באפריל 2119 שנים אם את מתכוונת לקליטת מחרוזת מהמשתמש (ולפי השאלה אני מבין שאת עובדת ב c++) את יכולה להשתמש ב getline שנמצאת במחלקה cin:cin.getline (myStr,maxSize);כאשר הפרמטר myStr הוא שם המחרוזת שלך ו maxSize הוא מספר התווים המקסימלי.
פורסם 2006 באפריל 2119 שנים אני לא חושב שהשאלה דורשת לקלוט מחרוזת ממשתמש console.ה-class שמבקשים לבנות הוא מעין interface למחרוזת C מהסוג הישן של מערך char-ים. אין כאן באמת תוכנית שניתנת להרצה שתקלוט מחרוזת מה-console, או בכלל קוד כלשהו לכתוב ב-main.מה שכן, הגיוני שכן תהייה קליטת מחרוזת ממשתמש של ה-class אותו מבקשים לבנות. הוא יעביר את המחרוזת כפרמטר ל-copy constructor ולמת'ודה setString.בכל אופן, מימוש אפשרי:קובץ ה-header:class String {public: // Default Constructor String(); // Copy Constructor String(const char* newString); void setString(const char* newString); const char* getString() const;private: char m_string[256];};וקובץ המימוש:String::String() { // Setting m_string as an empty string. m_string[0] = '\0';}String::String(const char* newString) { setString(newString);}void String::setString(const char* newString) { // Copying newString to m_string. int i; for (i=0; newString[i]; ++i) { m_string[i] = newString[i]; } m_string[i] = '\0';}const char* String::getString() const { return m_string;}
פורסם 2006 באפריל 2119 שנים נדמה לי שאתה צודק... ראיתי "משתמש" אוטומטית חשבתי על משתמש קצה ככה שלא חשבתי שלזה היא התכוונה
פורסם 2006 באפריל 2319 שנים וקובץ המימוש:String::Stringvoid String::setString(const char* newString) { // Copying newString to m_string. int i; for (i=0; newString[i]; ++i) { m_string[i] = newString[i]; } m_string[i] = '\0';}}שתי הארות:1. חסר copy constructor שמקבל משתנה מהסוג של המחלקה ומעתיק אותו2. אין התייחסות להעברת ערכי NULL לפונקציה setString 3. אין התייחסות לאורך המחרוזת המועברת - מחרוזת שאורכה גדול מ-255 תווים תדרוס זיכרון או תגרום ל-exception בזמן ריצהלתשומת ליבך!דותן
פורסם 2006 באפריל 2319 שנים 1. צודק2. דווקא יש &newString[0]==&newStringלכן כש- newString הוא NULL הלולאה תצא.3. @#$%@^$%^$%^$%$root% (והמבין יבין)
פורסם 2006 באפריל 2319 שנים מחבר איך מממשים את הפונקציה של copy constructor ??ציטוט:void String::setString(const char* newString) { // Copying newString to m_string. int i; for (i=0; newString; ++i) { m_string = newString; } m_string = '\0';}ע"מ לקיים הצבה זו יש לממש אופרטור הצבה '=' כיצד עושים זאת???
פורסם 2006 באפריל 2419 שנים אופרטורים הם פונקציות לכל דבר.ככה לדוגמה מממשים את =String& String::operator=(const String& other) { // Do the copying here... return *this; // it is convention that operator= returns the object itself}
פורסם 2006 באפריל 2519 שנים כמה הסברים:COPY CONSTRUCTOR נקרא בדרך כלל כשאתה קורא לפונ עם ארגומנטים או כשאתה יוצר משתנה ומאתחל אותו.אופרטור השוויון נקרא כשאתה מבצע משתנה שווה למשתנה אחר.אם רוצים שיהייה שווה למשתנה אחר מאותה מחלקה, חייבים לממש את שניהם.ויותר פשוט:קיים חוק(או כלל אני לא זוכר) השלושה, שקובע שאם אתה צריך לממש את אחד מהפונ האלה, אתה חייב לממש גם COPY CTOR גם CTOR וגם את אופרטור השווה(בעצם עכשיו נראה לי שזה מדבר על הDTOR).ולעניין, COPY CTOR:#include <string.h>String::String(const String &s){strcpy(this->str_m, s->str_m);}
פורסם 2006 באפריל 2719 שנים http://www.fredosaurus.com/notes-cpp/oop-condestructors/copyconstructors.htmlhttp://en.wikipedia.org/wiki/Copy_constructor#C.2B.2B
פורסם 2006 באפריל 2719 שנים 1. חסר copy constructor שמקבל משתנה מהסוג של המחלקה ומעתיק אותוקומפיילר נורמלי מממש לך אותו לבד. כל עוד אתחול instance של ה-class בעזרת instance אחר נעשה באופן סטנדרטי (כמו פה), אני לא רואה סיבה למה לא לסמוך על המימוש של הקומפיילר.2. אין התייחסות להעברת ערכי NULL לפונקציה setString 3. אין התייחסות לאורך המחרוזת המועברת - מחרוזת שאורכה גדול מ-255 תווים תדרוס זיכרון או תגרום ל-exception בזמן ריצהנכון.אבל בשביל תרגיל כזה, זה נראה לי overkill.
פורסם 2006 באפריל 2819 שנים המימוש הסטנדרטי הוא ביט אחר ביט. אם יש לך הקצאות או טיפול אחר במצביעים עדיף לך ליצור COPY CTOR משלך.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.