שלום,שאלה

andav

New member
מה הכוונה ב-

"אם בטעות הייתי משתמש בפרמטר הראשון, הייתי מעיף את התונית, כי היה שם NULL." מה הכוונה - הפרמטר הראשון ?
 

andav

New member
לא מבין.

איך היית מעיף את התוכנית? אני לא איתך,מצטער.
 

vinney

Well-known member
לא משנה

זה לא כזה חשוב עקרונית, אם ניגשים למצביע שערכו NULL, אתה מקבל EXCEPTION.
 

andav

New member
OK,תודה רבה.

ואפשר לומר, שבהחלט ניראה שאתה בן אדם נחמד.
 

gmorphus

New member
מה אתה מתחנף ../images/Emo8.gif

אלי, הוא כנראה צריך ממך משהו
 
קודם כל

אני לא מבין מה הקשר בין override למה שכתבת פה. דבר שני, לבחורצ'יק ששאל את השאלה: אם יש לך מתודה שמדפיסה עיגול. כרגע היא מדפיסה סתם עיגול, אבל בעתיד היא תהיה מסוגלת להדפיס עיגול בצבע מסוים. כרגע כביכול כל מה שאתה צריך זה רק
void Print()​
אבל בעתיד כמו שאמרתי אתה תרצה
void Print(string color)​
במידה ותעשה שתי גרסאות של המתודה (כלומר גרסה שנייה תבוא נגיד כמה חודשים אחרי הגרסה הראשונה, כל אחד שהשתמש כבר במתודה הישנה בקוד שלו יצטרך להוסיף את הפרמטר השני. אבל אם מלכתחילה תעשה
void Print(string)​
ותגיד שכרגע הstring לא משמש לכלום אבל בעתיד הוא יקבע את צבע העיגול, אנשים שישתמשו במתודה שלך לא יצטרכו לשנות את הקריאה אליה כשתסיים לבנות את המתודה הסופית. כלומר אתה תגיד להם "כרגע זה לא משנה מה אתם מעבירים שם בפרמטר, זה תמיד יוצא שחור, אבל תדעו שבגרסה הבאה מה שתעבירו כן ישנה, כך שאם אתה לא רוצים לקמפל מחדש אז תדאגו כבר מעכשיו לכתוב שם את הצבע שאתם רוצים". סבבה?
 

Moridin

New member
במקרה כזה

הרבה יותר נכון לכתוב
void Print(string color = "black");​
לא?
 
כנראה

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

vinney

Well-known member
דווקא במקרה זה זה ממש לא מתאים

אם אתה יודע על השימוש העתידי, אז הוא כבר לא יהיה עתידי. אם אתה לא יודע על השימוש העתידי - אין לך דרך לדעת מה הטיפוס.
 
לא אמרתי שאני לא יודע מה השימוש

העתידי. אמרתי שהשימוש העתידי יהיה בעתיד. כרגע אין לי זמן לכתוב את המימוש המלא של המתודה ואני מוריד גרסה שמכילה מימוש חלקי. אני יודע שבגרסה 2 של הספרייה יהיה פרמטר מסוג string שיקבע מה הצבע. אני לא רואה מקרה שזה יותר מתאים בו (שוב, אני מדבר על הדוגמא שהוא הביא לפי הציטוט מהספר). דרך אגב, דוגמא יותר שימושית לזה (למרות שגם לא הכי נכונה) היא בשביל ליצור משתני dummies שיגדירו overloads אחרים למתודה. נגיד אני יוצר מתודה, ויוצר עוד מתודה עם אותו השם ואותם הפרמטרים אבל שמקבלת גם איזה bool נגיד ועושה משהו אחר, למרות שהיא לא צריכה את המידע שבתוך הbool שמועבר.
 
אתה לא יכול לעשות override לprintf

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

vinney

Well-known member
זה התקמפל כמו ענק

אחרת לא הייתי מעלה את זה
בVC6, אתה מוזמן לבדוק
 
אכן מתקמפל

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

vinney

Well-known member
גם לדעתי זה לא ממש תקין

אולי כדאי לבדוק את זה בGCC, לראות איך זה מתנהג שם
 

andav

New member
אני משתמש ב- mingw שזה

(כמדומני) gcc + אפשרות להתעסקות עם חלונות של מיקוסופט וגם פה זה עובד.
 
למעלה