עבור לתוכן
View in the app

A better way to browse. Learn more.

HWzone

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

עזרה בשימוש בפולימורפיזם על map בc++

Featured Replies

פורסם

אהלן.

יש לי מחלקה אבסטרקטית נקרא לה A עם שיטה אחת נקרא לה perform שממנה יורשות שתי מחלקות נקרא להן B ו C.

אני רוצה להכניס אובייקטים של B וC לתוך multimap וכשאני עובר על הmultimap להפעיל על כל איבר שאני עובר עליו את השיטה perform מבלי שאני בודק מאיזה סוג הוא.

מה שעשיתי הוא אתחלתי multimap ששדה הdata שלו הוא מסוג פויינטר לA.אתחלתי משתנים באופן הבא:

A* somthing=new B או A* somthing=new C.

ואז אני מבצע:

mymultimap.insert(make_pair(key,somthing)w; להתעלם מהw בסוף.

כשאני עובר באיטרציה על המאפ ומנסה להפעיל את perform על שדה הdata אני מקבל הודעת שגיאה, האובייקטים מזוהים כA, ואני מקבל segmentation fault.

גם כאשר אני מנסה לגשת לשדה של אחת המחלקות B אוC הוא מזוהה כA וזורק לי שגיאה שלA לא קיים שדה כזה.

את פעולת ההפעלה אני מבצע כך:

it->second->somefeild/somemethod()w. להתעלם מהw

it הוא איטרטור שרץ על המולטימאפ.

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

נערך על-ידי FARKASH7

פורסם

א. פשוט תשים קטע קוד הכי קטן שמתאר את הבעיה.

ב. איך הגדרת את ה MULTIMAP

פורסם
  • מחבר

הכל רשום בהודעה הראשונה, אבל אני אחזור על זה.

המולטימאפ מוגדר ככה:

<string, A*>

ככה אני מכניס איבר למאפ:

A* somthingtoinsert = new B()w

mymap.insert(key,somthingtoinsert)

אני עובר בעזרת איטרטור it על המפה ומנסה להפעיל שיטות/לגשת לשדות כך:

it->second->somefeild/somemethod()w. להתעלם מהw

נערך על-ידי FARKASH7

פורסם

טוב, אולי מישהו יעזור לך, נראה לי שכדאי לך:

א. להשתמש ב CODE TAG בשביל לשים את הקוד במקום W, זה יותר קריא.

ב. כדאי לך לעשות מה שאמרתי (לרשום קוד, ולא "אני עובר בעזר איטרטור it).

בהצלחה.

פורסם

אני מניח שB ו C יורשים מA. אם כך אתה פשוט צריך מתודה ווירטואלית ב A שנקראת PERFORM ו B ו C ממשים את אותה מתודה.

חפש virtual method יש גם משהוא שנקרא pure virtual שאז אתה לא צריך לתת ממימוש ב A אבל זה לא קריטי, אתה יכול פשוט לתת מימוש ריק.

ארכיון

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

דיונים חדשים

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.