עוד שאלה על map

vinney

Well-known member
עוד שאלה על map

אני מגדיר map<int, C> כשC זה מחלקה כלשהי שלי. כשאני עושה insert לזה, אני מקבל error C2664. על שום מה ולמה? תודה לעוזרים.
 

HaRmosh

New member
בדיקה קצרה

בקישור המצורף, מראה שאין מתודה שמקבלת פרמטרים בצורה שהשתמשת בה, ולכן לדעתי הודעת השגיאה.
 

voguemaster

New member
ווויני! ../images/Emo13.gif

רק שתדע דבר לעתיד שיחסוך לך צרות (במידה ואתה לא יודע כבר). בכל ה-containers של STL, כשאתה מגדיר אותם בתור מכילי מחלקה מסוג C ואתה עושה insert (או כל פעולה דומה) לאובייקט מסוג C מה שקורה בעצם זה שה-container יוצר לו עותק של האובייקט שהעברת לו. זה משמעותי מפני שאם לא הגדרת copy ctor כמו שצריך במחלקה שלך אתה עלול להיתקל בצרות כי מבוצע shallow copy. רק תזכור לעתיד. הייתי ממליץ לך לעבוד עם מצביעים לאובייקטים מסוג C ולא עם אובייקטים מסוג C. וספציפית לגבי map:
typedef map<int, C*> CMapper; typedef map<int, C*>::iterator CNodeIterator; // to add to the map CMapper cm; C* pC = new C; cm[1] = pC; // inserts the pointer with an integer key equal to 1​
זו השיטה המקובלת עד כמה שידוע לי
 

vinney

Well-known member
no can do

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

Zack DA

New member
אני לא יודע מה אתה רוצה לעשות,

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

vinney

Well-known member
זה בעייתי משהו, אכן

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

voguemaster

New member
אני אגיד לך דבר כזה

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

vinney

Well-known member
אני לא רוצה לעקוב

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

DadleFish

New member
אז תעבוד עם smart pointers.

תאחסן ב-map אובייקטים שהם smart pointers לאובייקטים שלך. לא זליגות, לא בלאגנים, לא כלום. copy אמיתי יכול להיות מאוד בעייתי, שלא לדבר על הזמן והזכרון המבוזבזים.
 

voguemaster

New member
ד"א, אם הזכרת

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

vinney

Well-known member
מה זה ?

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

vinney

Well-known member
לא יכול להשתמש בboost

זה פרוייקט להגשה, חייב להיות סטנדרטי
 

עופר ב.ה

New member
אז תממש אחד כזה

יש כמה נקודות עדינות, אבל לממש reference counted pointer זה לא דבר כה מסובך..
 
למעלה