ווטסאפ - לינוקס, BSD, קוד פתוח ותוכנה חופשית בעברית. Whatsup - Linux, BSD, open source and free software in Hebrew

 
 
  כניסת חברים · רישום · שכחתי סיסמה  
tux the penguin
תגובה לנושא
צפיה בנושא הבא Printable version התחבר כדי לבדוק הודעות פרטיות צפיה בנושא הקודם
SFאורח · ·
 

הודעה פורסם: 27/11/2017 - 10:39
נושא ההודעה: שאלה על const-reference ב-C++

כבר שנים לא כתבתי ב-C++, אבל נתקלתי היום בנושא הזה ואני מנסה להבין.
מה בדיוק מותר ומה אסור לעשות כשמעבירים const reference?

לדוגמה - יש לי מחלקה Foo, ובמקום אחר פונקציה המוגדרת:

קוד:


void bar (const Foo &f) {}



מובן שאסור לי בתוך הפונקציה bar להציב ערך חדש למשתנה f (דבר שישנה את המצביע גם מחוץ לפונקציה, היות והעברתי by reference). אבל האם יש מגבלה על קריאות לפונקציות על f?
נאמר ויש לי פונקציות שמשנות את המצב הפנימי של Foo, כמו למשל setBaz - האם אוכל לקרוא להן מתוך bar?
או שמא קריאה לפונקציות על Foo מוגבלת רק לפונקציות שמוגדרות const ב-Foo? (ועל כן, אם אני מבין נכון, אסור להן לשנות שדות של Foo...)

בנוסף - האם יש מגבלות על מתודות אחרות שמותר לי לקרוא להן? מניח שאסור לי לקרוא למתודות שמקבלות Foo by reference אבל לא const, כן?

תודה.
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
SFאורח · ·
 

הודעה פורסם: 27/11/2017 - 11:28
נושא ההודעה:

אז אחרי עוד הרבה חיפושים מצאתי עמוד שמסביר את זה:

https://isocpp.org/wiki/faq/const-correctness

(מרמור: למה כל כך קשה למצוא תיעוד ברור על C++? רוב העמודים שמצאתי הכילו מידע כל כך חלקי שאפילו אם כבר הייתי יודע את זה היה קשה לי להבין מה הם אומרים).

תשובה למי שמתעצל לקרוא: כן, const מונע ממך לשנות מצב פנימי של האובייקט, וזו שגיאת קומפילציה לקרוא על ארגומנט שהועבר by const reference לפונקציה שלא הוגדרה const או שלא מקבלת אותו כ-const (אם בכלל מקבלת reference).
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
אורח · ·
 

הודעה פורסם: 27/11/2017 - 18:30
נושא ההודעה:

SF :
אז אחרי עוד הרבה חיפושים מצאתי עמוד שמסביר את זה:

https://isocpp.org/wiki/faq/const-correctness

(מרמור: למה כל כך קשה למצוא תיעוד ברור על C++? רוב העמודים שמצאתי הכילו מידע כל כך חלקי שאפילו אם כבר הייתי יודע את זה היה קשה לי להבין מה הם אומרים).

תשובה למי שמתעצל לקרוא: כן, const מונע ממך לשנות מצב פנימי של האובייקט, וזו שגיאת קומפילציה לקרוא על ארגומנט שהועבר by const reference לפונקציה שלא הוגדרה const או שלא מקבלת אותו כ-const (אם בכלל מקבלת reference).


אם להיות קצת cucu אפשר לעשות :

קוד:

void bar (const Foo & F )
{
Foo * ptr = (Foo * ) &F; //or static_cast it is irrelevent for this example
ptr->field = 1;
}


כל נושא ה const correctness זה המלצה בלבד.
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
elcucoלא בפורום כעת ת.הצטרפות: 14/10/2003 · הודעות: 6255 ·
 

הודעה פורסם: 27/11/2017 - 23:24
נושא ההודעה:

אתה תמיד יכול לעשות:

קוד:

char *self = (char*) this;
self[12] = 2;


כי, מה זה משנה, אני יודע מההיסט של השדה הזה בכל זאת... צריך לנסות לעבוד עם השפה ולא להילחם איתה.
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
borsoodלא בפורום כעת ת.הצטרפות: 05/01/2007 · הודעות: 306 ·
 

הודעה פורסם: 28/11/2017 - 10:11
נושא ההודעה:

SF :
אז אחרי עוד הרבה חיפושים מצאתי עמוד שמסביר את זה:

https://isocpp.org/wiki/faq/const-correctness

(מרמור: למה כל כך קשה למצוא תיעוד ברור על C++? רוב העמודים שמצאתי הכילו מידע כל כך חלקי שאפילו אם כבר הייתי יודע את זה היה קשה לי להבין מה הם אומרים).

תשובה למי שמתעצל לקרוא: כן, const מונע ממך לשנות מצב פנימי של האובייקט, וזו שגיאת קומפילציה לקרוא על ארגומנט שהועבר by const reference לפונקציה שלא הוגדרה const או שלא מקבלת אותו כ-const (אם בכלל מקבלת reference).

isocpp הוא כן העמוד הרשמי של השפה. להבדיל ממה שהאורח כתב const correctnes זה כן דבר חשוב ויש לו השפעה משמעותית גם על הנכונות של הקוד וגם על הביצועים.
תיעוד מעולה על cpp תמצא באתר cppreference,org. הבעייה היא שכיוון שהתיאור שם מדוייק הוא לא תמיד ברור במיוחד חא למתחילים.
cplusplus.com הוא גם אתר טוב , ברור יותר אבל יש בו כמה אי־דיוקים.
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית ביקור באתר המפרסם  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
הצגת הודעות מלפני:     
מעבר אל:  
כל הזמנים הם GMT + 2 שעות
תגובה לנושא
צפיה בנושא הבא Printable version התחבר כדי לבדוק הודעות פרטיות צפיה בנושא הקודם
PNphpBB2 © 2003-2004 

תוכן הדיון

  1. אורח [SF]
  2. אורח [SF]
  3. אורח
  4. elcuco
  5. borsood