שאלה על STL...

שאלה על STL...../images/Emo4.gif../images/Emo26.gif

הצילו... פערי ידע ב-CPP ו-STL... אני יכול להגדיר vector של מחלקה אבסטרקטית? למשל - אתם בטח מכירים את הדוגמה הקלאסית של מחלקת animal אבסטרקטית שממנה יורשות מחלקות dog, cat וכו'. השאלה שלי אם אפשר לעשות:
vector<animal> myzoo;​
ואז להוסיף לווקטור אובייקטים מהטיפוסים dog ו-cat?... כי כשאני עושה את זה הוא די צועק עלי שהוא לא מסוגל לעשות instance ל-animal... מה שקצת מבלבל אותי, כי אני לא רואה שום-סיבה שהוא ינסה לבנות אובייקט animal (אני הרי כבר נותן לו אובייקט dog מוכן - איזו סיבה בעולם יש לו לנסות ליצור animal??) תודה מראש...
 

eyalbd

New member
תיצור וקטור של פוינטרים

למשל כך:
vector<animal*> myzoo; myzoo.push_back( new dog ); myzoo.push_back( new cat ); // ....​
הקומפיילר צועק בצדק - אתה לא יכול ליצור instance למחלקה אבסטרקטית.
 
אין לי בעיה עם הקומפיילר...../images/Emo26.gif

יש לי בעיה עם ה-STL...
הרי לא אני ניסיתי ליצור instance למחלקה אבסטרקית- אלא ה-vector ניסה! אני כולו ניסיתי להכניס לו אובייקטים מוכנים של מחלקות קונקרטיות! מה הקטע שלו?? הוא לא יכול להחזיק את האובייקטים עצמם (של dog ו-cat)?? וכן - ככה פתרתי בסוף... עם פויינטרים... אבל הבאסה שאני צריך להתחיל להתעסק עם שחרורי זכרון עכשיו, וממש לא בא לי (אחרי חיי ה-GC הטובים ב-Java, אני פוחד ליפול על משהו שטותי...
). תודה על ההענות...
 

gilad_no

New member
מה לגבי auto_ptr?

אי אפשר ליצור ווקטור כזה? (כך לא תצטרך לדאוג לשחרור זיכרון)
vector< auto_ptr<animal*> > ar;​
לא בדקתי, אבל אולי זה יעבוד. ומקסימום, תיצור מחלקה חדשה של ווקטור שיורשת מVECTOR ובמפרק שלה היא משחררת את הזיכרון. ככה תוכל להשתמש בה בכל מקום שתרצה בלי לדאוג יותר.
 

חובבן

New member
זה לא יעבוד

כי הקונטיינר מצפה ל copy constractor שהפרמטר שלו הוא const. מכיון ש copy על auto_ptr משנה את האובייקט ממנו מעתיקים זה לא יתקמפל.
 

אלדד28

New member
אסור לעבוד עם auto_ptr ועם

קונטיינרים. צריך לעשות smart pointer מסוג אחר, כמו COW או RefCount, ולהשתמש בו. auto_ptr הוא יותר מדי בסיסי ולא מתאים לפעולות הנדרשות ע"י קונטיינרים.
 

voguemaster

New member
אבל זה מה שקורה בפועל

כשמבצעים instantiation של TEMPLATE כלשהו. בכל מקרה אתה רוצה לעבוד עם מצביעים בגלל שאתה רוצה לעבור באיטרציה (נניח) על הווקטור ומן הסתם לקרוא למתודות וירטואליות של בע"ח השונים שיש לך (רק ניחוש
). ותשתמש במצביעים חכמים. נסה לחפש smart pointers ו-STL containers. יש איזה מאמר שנותן הרבה מידע בנושא. יש הרבה pitfalls בקטע הזה..
 

אלדד28

New member
אתה יכול לוותר על פוינטרים,

תעבוד עם smart pointers, ואז לא תצטרך לדאוג לשום שחרור זכרון.
 
למעלה