עבור לתוכן

operators overloading ב ++c: string1 = string2 + string3 מישהו יכול לעזור לי

Featured Replies

פורסם

הי !

אני מנסה לבצע: string1 = string2 + string3 באופן הבא:

1. header file למחלקה str כדלקמן:


//str1.h

// header file for class str


class str
{
   public:
      str(char *);
      void setS(char *);
      str &operator+(str &);
      str &operator=(str &);
   private:
      char *s;
      int l;
};

2. ה implementation file של המחלקה כדלקמן:


//str.cpp

// implementation of class str

#include "str.h"
#include <new>
#include <iostream>

str::str(char *myS)
{
   setS(myS);
}

void str::setS(char *yoS)
{
   int myL = strlen(yoS);
   s = new char[myL];
   strcpy(s, yoS);
}

str &str::operator+(str &yoStr)
{
   int myL = strlen(yoStr.s) + strlen((*this).s);
   char *tempC = new char[myL];
   strcpy(tempC, (*this).s);
   strcpy(tempC + strlen((*this).s), yoStr.s);

   str myS3(tempC);
//line 27 - error
   return myS3;
}

str &str::operator=(str &yoStr)
{
   strcpy((*this).s, yoStr.s);
   return (*this);
}

והקובץ השלישי, ה driver:


//temp.cpp

// driver file for class str

#include "str.h"

int main()
{
   str myS1("Happy");
   str myS2("Birthday");

   str myS3("");
   myS3 = myS1 + myS2;
   return 0;
}

אח"כ מהדר :

bcc32 temp.cpp str.cpp

ומקבל הודעת שגיאה כדלקמן:

str.cpp 27: attempting  to return a reference  to local variable  'myS3'  in function str::operator+(str &)m

אודה למי שיעזור לי ויחלצני מן המיצר.(מה הטעות ? כיצד עושים זאת נכו ?)

תודה Q

פורסם

1. אתה לא יכול ליצור משתנה על ה- stack ולהחזיר reference שלו (הזיכרון יתפנה כשהפונקציה תחזור - לאן בדיוק יפנה ה- reference?)

2. יש שתי דרכים להגדיר את operator+:

str operator+(const &str)

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

friend str operator+(const &str1, const &str2)

ז"א לקחת שני str ולהחזיר אובייקט חדש.

פורסם
  • מחבר

הבנתי את שורש הרע במה שכתבתי  ::).

אני מודה לך !  :xyxthumbs:

פורסם

האופרטור = שלך לא טוב. אתה עושה שם STRCPY, כשבעצם אתה צריך לעשות STRDUP, ולמחוק את ההקצאה שלך בהתאם.

דוגמא:

בהתחלה str="hihi"

ועכשיו אתה עושה str = "hihi" + "hihi", כלומר str = "hihihihi".

אתה מעתיק ל- str את hihihihi, אך בstr יש רק 5 יCHARים, לעומת hihihihihi שיש שם 9 CHARים.

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

ושוב, משהו חשוב מאוד הוא שכדאי לך לעשות DELETE ב- SET אם כבר יש שם מחרוזת.

הצעה להוספה



void clear()
{
if(s!=NULL)
delete [] s;
}
str(char *ss)
{
s = NULL;
setS(ss)
}
int setS(char *ss)
{
clear();
s = strdup(ss);
l = strlen(ss);
return l;
}
str &str::operator=(str &ss)
{
setS(ss.s)
}

זה לא הכי יעיל, אבל הכי הגיוני לעשות(שזה הרעיון בעצם של OO - שיהייה כמה שיותר דומה למציאות).

פורסם
  • מחבר

אני מאוד מודה לך.

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

אעיין במה שהצעת ואנסה זאת.

ושוב תודה.

ארכיון

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

דיונים חדשים