בעיה ב ++C

MaD-d0g

New member
בעיה ב ++C

שלום לכולם אני מנסה לבנות מחלקה של מחרוזת דינמית. המחלקה שלי מסוגלת לקלוט מחרוזת, להחזיר את המחרוזת ולהדפיס מחרוזת. ניסיתי לבנות אופרטור השמה בין 2 אוביקט מאותו הסוג, אבל אני לא מצליח (שגיאה לא מובנת) הקוד של ה main הוא :
CString st1 ("Hello World !"); CString CScheck; CScheck = st1;​
הקוד של האופרטור הוא:
CString CString::eek:perator= (CString &s) { return (operator=(s.str)); } CString CString::eek:perator= (char *s) { if (str) { delete [] str; } strcpy (str, s); return (*this); }​
מישהו רואה את הבעיה
תודה מראש
 

eyalbd

New member
תנסה את זה

CString& CString::eek:perator= (CString &s) { return (*this =s.str); } CString& CString::eek:perator= (char *s) { if (str) { delete [] str; } // Missing allocation // int len = strlen(s) + 1; str = new char[len]; // Back to original code // strcpy (str, s); return (*this); }​
 

MaD-d0g

New member
וואלה ../images/Emo4.gif

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

MaD-d0g

New member
ויש לי גם בעיה בפונקציה Mid

שבניתי הפונקציה חברת מחלקה CString. היא מתנהגת כמו הפונקציה MID בויבי היא נראית ככה: (אגב, חבל להתעקב יותר מדי על השורות הראשונות, זה סה"כ בדיקת תקינות)
CString CString::Mid (int start_pos ,int length) { CString CString_ret_val; int Real_Length; char *mid; int loop_counter; // Check if the start position if less the 1 (the first char) or the length is bigger than // the string itself if (start_pos > Length() || start_pos < 1 ) { return (NULL); } // Check the REAL length of the new string if ((start_pos + length) > Length ()) { Real_Length = Length() - start_pos; } else { Real_Length = length; } mid = new char [Real_Length + 1]; for (loop_counter = 0; loop_counter < Real_Length; loop_counter++) { mid[loop_counter] = str[start_pos + loop_counter]; } mid[loop_counter] = '\0'; CString_ret_val.SetString (mid); delete [] mid; return (CString_ret_val); }​
הקוד ב Main הוא
CString st1 ("Hello World !"); CString CScheck; CScheck = st1.Mid (1,2);​
הפונקציה מחזירה את מה שהיא צריכה, אבל באופרטור ההשמה מגיעה מחרוזת ריקה (או משהו בסגנון)
 

MaD-d0g

New member
בדיוק ככה..

קופי קונסטרקטור:
CString::CString (const CString &st) { CString(st.str); // Use the first constructor to create }​
יש לי גם קונסטרקטור עם פרטמר, שב copy c'tor אני קורא לו.
CString::CString (char *st) { if (st) { str = new char [strlen (st) + 1]; strcpy (str, st); } else { str = NULL; } }​
וזה ה SetString'ים שלי
void CString::SetString (char *st) { if (str!=NULL) { delete [] str; } if (st) { str = new char [strlen(st)+1]; strcpy (str,st); } } void CString::SetString (const CString &st) { SetString (st.str); }​
 

MaD-d0g

New member
בעעע ../images/Emo70.gif

אני שונא להקפיץ אבל זה ממש חשוב לי...
 

Metheny

Member
נראה לי...

שהבעייה בפונקציה Mid, שאתה מחזיר אובייקט מקומי (CString_ret_val), ואז אחרי שהפונקציה נגמרת, המידע שהיה בו נעלם, ולכן מה שנכנס ל-CSCheck במיין זה זבל
 

גיל14

New member
שטויות...

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

Metheny

Member
תרגע....

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

גיל14

New member
חי נפשי, אתה צודק

סליחה, שכחתי את הראש בבליך לפני החופשה...
 

גיל14

New member
אני סתם מגשש באפילה

לא רואה שום בעיה הגיונית (לסי++ יש דברים קצת מעצבנים ולא הגיוניים לפעמים..) עם הקוד. תנסה במקום Length() לכתוב this.Length() או *this.length, איך שצריך, אני חלוד בדברים האלה.
 

MaD-d0g

New member
תודה ../images/Emo70.gif

אני אבדוק את זה מאוחר יותר כשאני אחזור הביתה. אגב, למי שאמר שזה בגלל שאני מחזיר אוביקט דינמי. אני לא רואה הבדל בין החזרת משתנה שאני בניתי (CString) למשתנה שסופק לי ע"י המערכת (Int), אז זה לא נראה לי קשור.. גיל14, לא ידעתי שאתה גם פה
 

Metheny

Member
יש הבדל...

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

אלדד28

New member
בהודעה שלו "בדיוק ככה..."

הוא הציג לבקשתי את ה-COPY CTOR. הוא בסדר. זה משהו אחר.
 

Metheny

Member
אבל...

תסתכל על מה הוא עושה שם...
CString::CString (const CString &st) { CString(st.str); }​
זה רק אני, או שהוא רק מייצר אובייקט זמני ולא עושה איתו כלום?
 

אלדד28

New member
זה לא רק אתה,

טעות שלי. זה צריך להיות:
CString::CString(const CString &st) : CString(st.str) { }​
 

אלדד28

New member
בעצם לא -

אוף, מה יהיה היום עם חוסר הריכוז שלי?! הדרך העדיפה היא איך שהראיתי, אבל מה שהוא עשה היה קריאה מפורשת ל-CTOR הנ"ל, שגם זה יעבוד. הוא לא יוצר פה אובייקט סתם.
 

MaD-d0g

New member
לא לא לא ../images/Emo7.gif

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

לקרוא ל-CTOR אחד מתוך CTOR אחר של אותו ה-CLASS. מקסימום אפשר לקרוא ל-CTORS של האב. אתה חייב לאתחל מחדש את הערכים בכל CTOR בנפרד, או להעביר את האיתחול לאיזו מתודה פנימית כגון INIT, ולקרוא לה תוך כל ה-CTORS. שים לב שהיא לא יכולה להיות VIRTUAL.
 
למעלה