עזרה בC++

vbgames

New member
עזרה בC++

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

voguemaster

New member
תכנון עץ הירושה

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

vbgames

New member
אז אולי הבעיה יותר עמוקה

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

voguemaster

New member
הממ קוד מקור ?

אני לא זוכר בע"פ קוד מקור סטנדרטי של רשימה מקושרת, אבל אתה בטוח שאתה צריך ?? אולי תוכל להיעזר במחלקה שנקראת Array שאני בטוח שיש ב-CPP. ובכלל, למה זה משנה לך שהאובייקטים שונים אם יש להם מחלקת אם משותפת ??
 

אלדד27

New member
הבעיה היא לא ביצירת הרשימה המקושרת

שהרי אתה יכול לעשות אובייקט סתם, ריק, לרשת ממנו ולעשות רשימה מקושרת שלו. העניין הוא אחר. תשאל את עצמך - איזה פעולות אני רוצה לעשות על הרשימה המקושרת? אם הפעולות הן DRAW, SETPOSITION, למשל, אז תשים אותן. אם אתה רוצה גם לעבור על כל הרשימה ולקרוא ל - MOVE, תצטרך לשים גם את MOVE באובייקט הבסיס. אתה לא חייב ליישם את MOVE לכל האובייקטים. אם יש אובייקטים שלא זזים, פשוט אל תממש עבורם את ה MOVE. אובייקט הבסיס יכול להחזיק יישום ברירת מחדל שלא עושה דבר. עם זאת, אני מצטרף ל - voguemaster. אם יש לך אובייקטים שזזים ואובייקטים שלא זזים, אובייקט הבסיס שלך לא צריך להכיל את MOVE, אלא אתה צריך לפתור את הבעיה בצורה אחרת. למשל, תחזיק פונקציה באובייקט הבסיס שתיקרא IsMovable. אם היא מחזירה true, תהפוך את המצביע שיש לך לממשק שמזיז את האובייקט, ותקרא ל - Move. כלומר, נניח שיש לך אובייקט CMyObject, וזה אובייקט הבסיס של הרשימה שלך. אתה צריך ב - CMyObject פונקציה שתיקרא IsMovable ותחזיר true או false לפי הצורך. עכשיו יש לך שני אובייקטים - CMyMovableObject ו - CMyNotMovableObject. שניהם יורשים מ - CMyObject. כמו כן יש לך ממשק (אובייקט שהוא pure abstract ובלי משתנים), שנקרא IMovable. האובייקט CMyMovableObject יירש מ - IMovable. ב - IMovable תהיה פונקציה בשם Move, והיא תיושם ב - CMyMovableObject. ואז אתה רץ על רשימת ה - CMyObject שלך, ולכל אחד שואל IsMovable. אם כן, אתה עושה Casting למצביע שלך, כך שיהיה מסוג IMovable, ואז אתה פשוט מריץ את Move על המצביע החדש. מקווה שהבנת, מקווה שעזרתי
 

vbgames

New member
אחלה, תודה! עוד כמה דברים

לא הבנתי במה יעזור לי IMovable... אם אני יגדיר באובייקט הבסיס
void Move(tagPOINT *point){return;}​
מה שיקרה זה שרק מי שאני יגדיר לו מחדש את Move יוכל לזוז, ואם אני גם יוסיף את הפונקציה IsMovable אז הכל יעבוד לי חלק. זה פשוט לא היה נראה לי הגיוני בהתחלה
בכל מקרה רציתי להתקדם הלאה ולנסות לשייך את האוביקטים הזזים והלא זזים ליותר מרשימה מקושרת אחת. זאת אומרת שבמקום לשאול לגבי כל אובייקט IsMovable או IsSelcted אני ישייך את האובייקטים הזזים לרשימה אחת, ומתוכם אני ישייך את האובייקטים שנבחרו לעוד רשימה וכך הלאה... אבל באופן רגיל זה בלתי אפשרי מכיוון שאם אובייקט שייך לרשימה אחת הוא כבר לא שייך לאחרת. הצלחתי לעשות את זה, שוב בדרך ערבית... אבל אם תוכלו לתת לי עצה איך אתם הייתם עושים את זה אולי אוכל לשפר את זה בהרבה. תודה מראש
 

אלדד27

New member
הרעיון הוא שמי שלא צריך לזוז

בכלל לא תהיה לו פונקציה של MOVE. לא שהיא תהיה קיימת ולא תעשה כלום, אלא היא פשוט לא תהיה קיימת. זה הרעיון בממשקים (Interfaces) - שאתה יכול להצמיד "תכונות" (כמו Movable) לאובייקטים. אם יש לך רשימה אחת מרכזית של כל האובייקטים, מה הבעיה לעשות רשימות נוספות ש"משכפלות" את האובייקטים ברשימה השניה? אתה יכול להשתמש במצביעים או ב - reference. אצלי בפרויקט יש רשימה אחת מרכזית של הכל, ועוד הרבה מודולים שמקבלים הודעות על שינויים ברשימה הזו - והם מחזיקים רשימה לעצמם.
 

vbgames

New member
אתה יכול לכתוב איזה דוגמית

של מימוש Interface? כי נדמה לי שהספר שלמדתי ממנו לא דיבר על זה ומסתבר שזה קצת חסר לי... ובקשר לרשימה המקושרת הסתדרתי. עשיתי אובייקט שמכיל פוינטר לאובייקט ויודע להפעיל את הפונקציות הוירטואליות שלו, וככה נמנעתי מלשנות את המאפיינים prev ו next של האובייקט המקורי. אם הבנתי אותי סבבה ואם לא אז באמת לא משנה... שוב תודה מראש
 
למעלה