מערכים בC++

the new L

New member
אתה צודק

השפה תמיד בונה copy contructor אוטומטי שמפעיל אופרטור = על כל אחד מה members.
 

gmorphus

New member
לא תמיד "=" אם ההעתקה היא דרך

return או משהו כזה, אז מופעל הבנאי-מעתיק של אותם members. תשחק עם הקוד שהעליתי
 

selalerer

New member
הקוד בקובץ.

בVC התוכנית קורסת (אבל זה רק בגלל ההדפסה, זה קורא תווים מעבר לזכרון) וב++DEV C זה לא מדפיס כלום (כנראה כי הקומפיילר מאפס זכרון או משהו כזה, אז זה נתקל ישר בNULL).
 

gmorphus

New member
../images/Emo26.gif הטענה שלי עדיין עומדת!

שים לב בd'tor אתה מוחק את המחרוזת. דבר שהוא נכון לעשות. אבל, כשאתה סומך על הקומפיילר שיעתיק לך אובייקט אז אתה צריך לזכור שיש לו מגבלות. למה אני מתכוון? ה str שלנו הוא char*. כלומר מצביע. הקומפיילר לא יעתיק לך את המחרוזת, אלא הוא יעתיק לך את הערך של המצביע. ולכן, האובייקט tmp שנוצר לך בתוך GetOne מקבל איזשהו ערך ו str מתאים (עד כאן הכל בסדר). במשפט הreturn נותר אובייקט נוסף באמצעות בנאי-מעתיק שהקומפיילר ייצר בשבילך. הבנאי-מעתיק הזה פשוט מעתיק את הערכים מtmp הנ"ל, ובאופן ספציפי עבור str. כלומר ה str שבאובייקט שמוזר יצביע על אותו מקום שעליו הצביע tmp. אבל, tmp נמחק כשהפונקציה GetOne מסתיימת, ומתבצע delete [] str... אני מניח שמכאן הכל ברור לך. אם לא, תנסה לבטל את הdelete בd'tor, או שתקצה את tmp בתוך GetOne דינאמית. או שיותר פשוט, תשים break point ותראה הערך של str בכל שלושת האובייקטים שנוצרים (tmp בתוך GetOne, אובייקט נוסף בreturn, והאובייקט שמשמאל לפעולת "=" ב main) זהה.
 

selalerer

New member
הבנתי אותך.

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

gmorphus

New member
כן ולא

אם אתה דואג להשתמש רק באובייקטים שיש עליהם אופרטור של העתקה, והם לא מצביעים, אז אין לך שום בעיה. במקום char* אתה משתמש ב string, במקום סתם מערך, אתה משתמש ב vector, או במחלקה שתעטוף את המערך ותממש אופרטור "=". אני לא אומר שזה לא רעיון טוב, אבל אם אתה עובד נכון מלכתחילה אז אין שום בעיה.
 

selalerer

New member
האם אני צריך להבין שהיום אין לי שום

סיבה להשתמש במצביעים במחלקה? (זאת שאלה רצינית - האם הכלים של STL ביטלו את הצורך?)
 

gmorphus

New member
תשמע

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

VBMaster2

New member
שאלה קצרה על חזקה

האם יש ב CPP אופרטור ספציפי עבור פעולת החזקה?
 

the another one

New member
אין אפורטור אבל...

יש פונקציה ! קוראים לה pow והיא נמצאת בספרייה של math.h . 8=(pow(2,3
 
לא, אבל...../images/Emo26.gif

תחשוב על האפשרות לא להשתמש במערך, אלא באחת המחלקות שמטפלות במבני-נתונים. יש לך מגוון containers ב-STL. קח לך איזה list או vector, ותוכל להגדיל אותו כמה שבא לך...
 
למעלה