העמסת פונקציות C++

פרפרלה

New member
העמסת פונקציות C++

שלום,

ב C++
יש לי פונקציה שההצהרה שלה היא:

foo1(char* mode = NULL)

כלומר: או שהיא מקבלת את הסטרינג mode או לא (העמסת פונקציה).

בתוך הפונקציה הזו, יש קריאה לפונקציה foo2 מקלאס אחר.
גם foo2 יכולה לקבל את הסטרינג mode או לא.

השאלה היא, איך לקרוא ל foo2? הרי אני לא בטוחה שקיבלתי את mode ב - foo1 . אם אני אקרא ל foo2 ככה:

s = myClass->foo2(mode)

אז תהיה לי בעיה במקרה ש foo1 לא קיבלה את mode. האם זה נכון?

איך אפשר לפתור בעיה זו?
תודה.
 

BravoMan

Active member
תלוי איך foo2 בנויה:

ב-foo1 אין העמסת פונקציות. יש ערך ברירת מחדל לפרמטר, וזה דבר שונה מאוד.

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

foo1() {}

זו היית העמסה, ובגרסה זו (ללא פרמטרים) של foo1 באמת לא היית יכולה להשתמש ב-mode כי הוא פשוט לא מוגדר.

אבל, מה שיש לך הוא ערך ברירת מחל לפרמטר mode של foo1 שהוא מצביע למערך של תווים.
אם תקראי ל-foo1 ללא פרמטר, mode עדיין יהיה זמין, רק שהוא יקבל אוטומטית ערך NULL בתוכו.
למעשה, בדוגמה שלך לכתוב foo1() z ולכתוב foo1(NULL) z זה אותו הדבר, כי תקרא אותה הפונקציה.
במקרה של העמסה, היו נקראות שתי פונקציות שונות.

אז השאלה האמתית היא: האם פונקציה foo2 יודעת להתמודד עם פרמטר mode שהוא NULL בתוך הקוד שלה?

אם היא כתובה כמו foo1, עם ערך ברירת מחדל, אז היא בוודאי יודעת.

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