עבור לתוכן

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

Featured Replies

פורסם

על טיפוסים(מחלקות) שונים ? (לעשות פולימורפיזם ל4 הסוגים זה לא כל כך מתאים כי אין להם קשר ביניהם)

האם ניתן לעשות מחלקה אבסטרקטית של רשימה מקושרת ואותה יירשו 4 מחלקות רשימות מקושרות נגזרות שיפעלו לפי מתודות מתאימות לטיפוס ?

פורסם

נראה לי שלא הבנתי את השאלה

אני אנסה לענות עליה במילה אחת templates?

אני מניח שלא הבנתי את השאלה, כי סיבכת 2 שאלות.

האם ניתן לעשות רשימה מקושרת שתיהיה מסוגלת להצביע על סוגים שונים של טיפוסים? כן, על ידי templates, בשיטות ישנות יותר(שפת c)

ומסובכות יותר, עושים את זה עם מצביעי void והמרתם, פשוט מיותר כשקיים templates.

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

פורסם

הנה התחלה:


template <typename T>
struct Node
{
T value;
Node* next;
};

בסוג שלמעלה, יש מחלקה Node<T> המכילה את הטיפוס של הרשימה.

עוד דרך לעשות רשימה מקושרת זה כאשר בכל Node<T> יש מצביע לערך (כלומר מצביע ל-T) במקום את הערך עצמו.

פורסם

יש לך טעות קטנה - אין טיפוס כזה "Node", צריך לשים <Node<T.

פורסם
  • מחבר

שכחתי להגיד.... בלי TEMPLATES (כי עוד לא למדנו).

תודה

פורסם
  • מחבר

אני אנסה להסביר את הבעיה יותר טוב....

יש לי 4 קלאסים (CLASS) שונים .

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

למממש 4 קבצי H ו-4 קבצי CPP נראה לי קצת בזבזני...

איך אני יכול להשתמש בכל הנושא של ירושה ופולימורפיזם כדי לממש את הבעיה ?

ניתן להגדיר מחלקה אבסטרקטית שך רשימה מקושרת שממנה יירשו כל הארבעה ?

יש הצעות ?

מקווה שזה ברור יותר...

תודה רבה מראש

פורסם

אז כן, אתה צריך להשתמש במחלקה אבסטרקטית.

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

פורסם

(יתכן שמה שכתוב פה נוגע יותר לפתרון הכללי ולא לתרגיל שאתה פותר, אבל עדיין כדאי לקרוא)

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

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

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

עוד דרך לבצע את המשימה בלי לחייב את 4 המחלקות לרשת מאב משותף זה mixins, אבל זה דורש multiple inheritence ובסופו של דבר התוצאה במקרה זה היא מימוש עקום של הפתרון הטמפלטי.

ארכיון

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

דיונים חדשים