עבור לתוכן

מערך מצביעים בהעברה למחלקה-בc++

Featured Replies

פורסם

שלום רב,

		cout<<"enter the length of "<<i+1<<" member"<<endl;
cin>>membersize;
stringg=new char[membersize+1];
cout<<"enter the string: "<<endl;
cin>>stringg;
arr[i]=new Groups(stringg,membersize

זו בקשת השאלה:

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

מחלקה "קבוצה" מכילה גודל הקבוצה (מספר איבריה) ומצביע לתחילתה.כתוב את המחלקה "קבוצה" עם הפונקציות הבאות :

בנאי:

- בנאי שמקבל קבוצה ע"' מערך קיים וגודל המערך ויוצר אובייקט-קבוצה בהתאם.

אני מבקש מהמשתמש להכניס גודל של איבר

ואז יוצר מערך בגודל זה

ומקבל מהמשתמש את המחרוזת

ואז יוצר מערך של אובייקטים.

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

הבעיה שלי היא להעביר את כל האיברים האלו שמהווים קבוצה אחת

(קבוצה שיש בה כמה מילים)

למחרוזת המוגדרת כפרטית במחלה גרופ.

אין לי בעיה עבור כל איבר

arr

לשלוח למחלקה את המחרוזת שלו,

אך בהמשך המשיחה עלי ליצור פונקציה ב-ת-ו-ך המחלקה ובעזרתה להשוות בין איבר מסויים לשאר הקבוצה או בין איברי הקבוצה לאיבר חיצוני

תודה רבה.

פורסם

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

לא כל כך ברור מה אמור לעשות הקוד שכתבת כאן, כי הוא לא ממש עושה את מה שהשאלה דורשת.

תעלה את השאלה במלואה, ואת הקוד במלואו.

פורסם

אני לא ממש מבין מה אתה רוצה לעשות אבל אני יכול להעיר בהתאם למה שהבנתי:

קודם כל, המתשתמש לא חייב לך שום דבר, חוץ מלהכניס כמה מחרוזות אחת אחרי השניה. כמה שבא לו. קלט מחרוזת מסתיים ברגע שהוא מקיש ENTER. סיום הקלט יתרחש כאשר הוא ילחץ ENTER פעמיים - כלומר יספק קלט של מחרוזת ריקה.

את גודל המחרוזת תדע ע"י מדידה של אורך הקלט. וגודל של סה"כ מערך תדע בסיום הפעולה. אתה יכול להקצות מערך בגודל שרירותי לשם התחלה כל כולו מאותחל ל 0 . כך תדע תמיד איפה נמצא האיבר האחרון.

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

האוביקט GROUP הוא מיכל של כמה אוביקטים של מילים.

מקווה שזה עוזר לך

פורסם

ליצור אובייקט שמכיל מחרוזת זה overkill, במיוחד כשיש כבר אובייקט כזה - string. לפי מה שהבנתי פותח הת'רד צריך פשוט להשתמש ב-null terminated strings, כמו ב-C.

פותח הת'רד, תקן אותי אם אני טועה, אבל לפי מה שהבנתי ממה שכתבת ומהת'רד הקודם שפתחת, נראה לי שאתה נוטה לעשות בקוד שלך דברים שפשוט לא נדרשו ע"י התרגיל.

פורסם

ליצור אובייקט שמכיל מחרוזת זה overkill, במיוחד כשיש כבר אובייקט כזה - string. לפי מה שהבנתי פותח הת'רד צריך פשוט להשתמש ב-null terminated strings, כמו ב-C.

מה overkill עכשיו?

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

אני גם חושב שקצת הגזמת - זה לא כל כך הרבה קוד. מחלקת STRING פשוטה שכותבים מאפס יכולה להיות מחלקה עם בסה"כ 2 פרמטרים ו5 פונקציות פשוטות. ואחרי שכותבים פעם אחת נכון, אז כל הכתיבה יותר מהירה כי לא צריך בכל מקום לבדוק מה קורה עם המחרוזת והאם יש גלישה והסיכוי לבאגים קטן יותר. זה גם מקל על כל הנושא של העברת משתנים.

לגבי שימוש באוביקט STRING הסטנדרטי - ממה שאני מנחש שהם תנאי התרגיל, כנראה שאסור לו להשתמש בזה אם הוא בשלב כזה של לימוד.

פורסם

אני מניח שהמטרה של התרגיל היא גם לא להגדיר מחלקה של מחרוזת. אם היו רוצים שיעשה את זה, היו מבקשים.

פורסם
  • מחבר

בסופו של דבר אמרו לנו שניתן להשתמש במחלקה "מחרוזת".

ואז נוצרה לי בעיה חדשה.

כאשר יצרתי פונקציה כזו:

void Group::Comparstring(Group otherObj){
.
.
.
}

ושלחתי לה מהראשי אובייקט מאותו סוג

obj1.Comparstring(obj2);

גפ אובג'1 וגם אובג'2 מוגדרים כאובייקט מסוג

Group

הקומפיילר אומר לי

1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall Group::Group(class Group const &)" (??0Group@@QAE@ABV0@@Z) referenced in function _main

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

void Group::Comparstring(const Group& otherObj){

מדוע כך?

תודה רבה.

ארכיון

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

דיונים חדשים