עבור לתוכן

בניית מחלקות

Featured Replies

פורסם

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

בקובץ ההצהרה: ב-private יהיה שדה מסוג char המכיל 256 בייתים.

בpublic צריך להיות:

Default constructor

copy constructor

setString

getString

איך אני מממשת כל אחת מהפונקציות הנ"ל בקובץ המימוש?????

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

תודה.

פורסם

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

ממה שכתבת, אין פונקציה שקוראת מחרוזת מהמשתמש. (זה לא חלק מהמחלקה)

פורסם

אם את מתכוונת לקליטת מחרוזת מהמשתמש (ולפי השאלה אני מבין שאת עובדת ב c++) את יכולה להשתמש ב getline שנמצאת במחלקה cin:

cin.getline (myStr,maxSize);

כאשר הפרמטר myStr הוא שם המחרוזת שלך ו maxSize הוא מספר התווים המקסימלי.

פורסם

אני לא חושב שהשאלה דורשת לקלוט מחרוזת ממשתמש 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;
}

פורסם

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

פורסם
  • מחבר

תודה. :hi:

פורסם

וקובץ המימוש:


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 בזמן ריצה

לתשומת ליבך!

דותן

פורסם

1. צודק

2. דווקא יש

&newString[0]==&newString

לכן כש- newString הוא NULL הלולאה תצא.

3. @#$%@^$%^$%^$%$root% (והמבין יבין)

פורסם
  • מחבר

איך מממשים את הפונקציה של 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';

}

ע"מ לקיים הצבה זו יש לממש אופרטור הצבה '=' כיצד עושים זאת???

פורסם

אופרטורים הם פונקציות לכל דבר.

ככה לדוגמה מממשים את =

String& String::operator=(const String& other) {
// Do the copying here...

return *this; // it is convention that operator= returns the object itself
}

פורסם
  • מחבר

אפשר גם מימוש של פונקציית copy constructor

וגם של setString

תודה

פורסם

כמה הסברים:

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

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

אם רוצים שיהייה שווה למשתנה אחר מאותה מחלקה, חייבים לממש את שניהם.

ויותר פשוט:

קיים חוק(או כלל אני לא זוכר) השלושה, שקובע שאם אתה צריך לממש את אחד מהפונ האלה, אתה חייב לממש גם COPY CTOR גם CTOR וגם את אופרטור השווה(בעצם עכשיו נראה לי שזה מדבר על הDTOR).

ולעניין, COPY CTOR:


#include <string.h>
String::String(const String &s)
{
strcpy(this->str_m, s->str_m);

}

פורסם

1. חסר copy constructor שמקבל משתנה מהסוג של המחלקה ומעתיק אותו

קומפיילר נורמלי מממש לך אותו לבד. כל עוד אתחול instance של ה-class בעזרת instance אחר נעשה באופן סטנדרטי (כמו פה), אני לא רואה סיבה למה לא לסמוך על המימוש של הקומפיילר.

2. אין התייחסות להעברת ערכי NULL לפונקציה setString

3. אין התייחסות לאורך המחרוזת המועברת - מחרוזת שאורכה גדול מ-255 תווים תדרוס זיכרון או תגרום ל-exception בזמן ריצה

נכון.

אבל בשביל תרגיל כזה, זה נראה לי overkill.

פורסם

המימוש הסטנדרטי הוא ביט אחר ביט. אם יש לך הקצאות או טיפול אחר במצביעים עדיף לך ליצור COPY CTOR משלך.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים