עבור לתוכן

++C מיון וקטור של מצביעים מטיפוס אבסטרקטי (pure virtual)

Featured Replies

פורסם

יש לי וקטור של מצביעים מטיפוס *A. ישנם שני מחלקות שיורשות מ-A ובעצם יש פולימורפיזם והוקטור מכיל מצביעים לכל אחד מהמחלקות הללו.

בעת שימוש באלגוריתם המיון של STL אני מקבל שגיאות שמקורן כנראה בכך שהיה ניסיון לייצר אינסטנס של מחלקה A.

למה בעצם זה קורה?

פורסם

ראשית, sort משתמש באופרטור השוואה > ועבור מצביעים אופרטור ההשואה > אינו עושה מה שאתה רוצה, כנראה (אלא אם כן אתה רוצה למיין לפי כתובת). צריך להגדיר "אופרטור" השוואה (בעצם פונקצית השוואה).

דוגמא ניתן למצוא כאן: http://cboard.cprogramming.com/cplusplus-programming/111974-sorting-stl-vector-pointers.html

לגבי השגיאות שאתה מקבל, האם אתה בטוח שטיפוס הוקטור הוא std::vector<A*> v?

פורסם
  • מחבר

אני מקבל את השגיאה:

instantiated from here.

וכן, טיפוס הוקטור הוא מצביע.

פורסם

טוב אין ברירה. תכתוב את הקוד בפורום. אל תשכח להשתמש בתג קוד ("#")

פורסם

גם אני נתקלתי בבעיה דומה, וקטור שמכיל אובייקט אבסטרקטי לחלוטין מתלונן על זה שהוא אבסטרקטי, ואח"כ גם דורש copy constructor או משהו בסגנון (יכול להיות שזה מגיע ממקור)

פורסם

אי אפשר לייצר וקטור (ולמעשה שום קונטיינר) של אובייקטים וירטואלים, כי אי אפשר לייצר אובייקטים וירטואלים.

ניתן לייצר וקטור של מצביעים מטיפוס וירטואלי.

וכן, וקטור דורש copy constructor ואופרטור השמה.

פורסם

מה הסיבה מאחורי זה?

יש איזשהיא השמה/העתקה של האובייקט בווקטור?

זה לא כמו רשימה מקושרת? (אני מגיע מC#/java/python שרשימות הם רפרנסים לאובייקטים)

פורסם

וקטור הוא מערך שניתן לשנות את גודלו (ככה הוא ממומש מאחורי הקלעים).

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

לכן, לדוגמה, אם A הוא מחלקה שאין לה בנאי ברירת מחדל, הקוד הבא לא יעבוד:

A* arr = new A[10];

כי הוא לא יודע איך לאתחל את האיברים של arr.

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

vector<A> vec(5, A(1,2));

שיוצר וקטור בגודל 5, שמכיל 5 עותקים זהים של A שמאותחל ע"י הפרמטרים 1,2 (זה דורש של-A יהיה גם copy constructor, מה שיש לו בברירת מחדל).

ארכיון

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

דיונים חדשים