שאלה ב- ++C

kמיר

New member
שאלה ב- ++C

שלום לכם,

אני מנסה לקרוא את '++Programming principles and practices in c' של stroustrup ויש שם משהו שאני לא מבין.
בעמוד 620 (העמוד מצורף) ישנה הגדרה של פונקציה בשם insert שכוללת שורה שבודקת האם this הוא nullptr.
אני לא מבין למה צריך את הבדיקה הזו ? יש למישהו רעיון ?

 

BravoMan

Active member
אין לי את הספר, ומוזר לי שזה מופיע

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

עד כמה שהצלחתי למצוא, לפי התקן זו התנהגות לא מוגדרת, אבל רוב הקומפיילרים בנויים כך, שהפעלת המתודה עצמה לא תגרור dereference של המצביע.
למעשה, מאחורי הקלעים, המימוש המקובל הוא שהמצביע לאובייקט מועבר כפרמטר ראשון "בלטי נראה".
לכן, כל עוד אתה לא ניגש לאיברי מחלקה (לא סטטיים) או בודק את השימוש ב-this כפי שעשו בדוגמה, אתה יכול לעשות משהו כזה:
Link *a = nullptr;Link *b = new Lint("Test");
Link *c = a->insert(b);
זה יעבוד, וב-C למעשה יהיה אותו מצביע שיש ב-b.
 

kמיר

New member
תודה על התשובה, אבל לפי מה שאתה אומר הבדיקה הזו בעצם הכרחית

כי למשל גם הקוד הבא יעבוד ויגדיל את number_of_elements אף על פי שתכלס אף אובייקט לא קיים.
struct A { static int number_of_elements;
void increment_number_of_elements() { ++number_of_elements; }}int X::number_of_elements = 0;int main() { struct A* pointer_A = nullptr; pointer_A->increment_number_of_elements();}
 

bismark1

New member
שים לב שהגדרת משתנה סטטי

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

בעזרת "ראש" ריק - מבחינה פונקציונלית זה הגיוני.
האמנם זה לא מוגדר גם בתקן החדש?
 

BravoMan

Active member
לא קראתי את מסמך התקן עצמו, אבל

לפי ציטוטים שנתקלתי במקומות שונים ב-SO (ונראה שהשאלה על הפעלת מתודות על מצביע ל-nullptr עלתה הרבה), בסעיף 5 ומשהו מציינים שזה מוגדר כהתנהגות לא מוגדרת גם בתקן 11.
&nbsp
לא מצאתי התייחסות לתקן 14, אולי שם כבר טיפלו בזה...
 
למעלה