פורסם 2005 במרץ 2020 שנים הי !אני מנסה לבצע: string1 = string2 + string3 באופן הבא:1. header file למחלקה str כדלקמן://str1.h// header file for class strclass 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
פורסם 2005 במרץ 2020 שנים 1. אתה לא יכול ליצור משתנה על ה- stack ולהחזיר reference שלו (הזיכרון יתפנה כשהפונקציה תחזור - לאן בדיוק יפנה ה- reference?)2. יש שתי דרכים להגדיר את operator+:str operator+(const &str)ז"א לחבר את האובייקט הנוכחי לפרמטר ולהחזיר אובייקט חדשfriend str operator+(const &str1, const &str2)ז"א לקחת שני str ולהחזיר אובייקט חדש.
פורסם 2005 במרץ 2120 שנים האופרטור = שלך לא טוב. אתה עושה שם 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 - שיהייה כמה שיותר דומה למציאות).
פורסם 2005 במרץ 2220 שנים מחבר אני מאוד מודה לך.באמת ה = לא עבד לי , ה + לעומת זאת כן עבד אחר שתיקנתי בהתאם להצעה שקעבלתי לעיל.אעיין במה שהצעת ואנסה זאת.ושוב תודה.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.