עבור לתוכן

הגדרת מערך של מצביעים בC++ ואיתחולו.

Featured Replies

פורסם

אני עדיין בחיתולי לגבי C++.

עבור תרגיל בית שמתאר מלון ונופשים יצרתי CLASS חדש שנקרא HOTEL וCLASS שנקרא GUEST. הHOTEL כולל מערך של GUEST. מאחר ואני לא יודע את מספר הGUESTS המקסימלי, אני רוצה ליצור מערך התחלתי בגודל של 10, ואם אני מגיע למספר הזה, אז ליצור מערך חדש בגודל של 20 וחוזר חלילה. רציתי לעשות את זה בצורה של יצירת מערך של מצביעים לGUEST.

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

בCLASS המלון ההגדרה למיטב הבנתי היא כזו:

Guest** guests;

עכשיו כבר בשלב הקונסטרקטור אני לא יודע עם מה אני מאתחל אותו. אני לא רוצה ליצור בעצם עדיין GUESTS, כך שאין לי שום NEW לעשות.

guests = מה?

בC זה היה כמובן השלב בו מבצעים MALLOC, מה אמור לקרות במקום?

פורסם

מה זאת אומרת? במקום malloc שים new. יענו, משהו כזה:

guests = new Guest*[10];

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

אגב, שני טיפים קטנים:

1. אל תוסיף כל פעם 10, אלא תכפיל את גודל המערך. זה יותר יעיל.

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

פורסם
  • מחבר

קודם כל תודה,

לא מצאתי את התחביר לזה.

לגבי הטיפים:

1. ברור שהגדלת המערך בקבוע היא לא יעילה - הגדרות התרגיל. זה יהיה הרבה יותר יעיל amortized בהכפלה.

2. שוב, בהגדרות התרגיל אסור היה להשתמש בשום מחלקה קיימת למעט STRING.

פורסם

ב-++C אין שום סיבה להשתמש ב-malloc. אין שום בעייה לעשות new למצביע.

רק חשוב לזכור לעשות delete לכל new שעשית. חשוב לדעת מי אחראי לשחרור הזיכרון.

פורסם

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

p = new blabla[10];

אז משחררים ככה:

delete [] p;

ולא סתם delete p.

ארכיון

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

דיונים חדשים