שגיאת C++: אין עומס יתר '=':

Sgy T C Yn Wms Ytr



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

תחביר

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







שְׁגִיאָה : אין התאמה ל 'מַפעִיל = '

דוגמה מס' 01:

תן לנו רעיון לגבי השגיאה הזו והשיטה לפתור אותה. כדי להבין את זה טוב יותר, נבצע דוגמה שבה נעביר את השמות באמצעות אובייקטים לפונקציה ואז היא תציג אותם. תחילה נכלול את קובץ הכותרת iostream. לאחר מכן, נכריז על מחלקה בשם 'האובייקט_ שלי'. בתוכם, הכרזנו על שני משתני מחרוזת בשם 'F_name ו-'L_name', ה-'F_name' שמציין את השם הפרטי של האדם כאשר ה-'L_name' מציין את שם המשפחה של האדם.



לאחר מכן, הכרזנו על בנאי ציבורי בשם 'my_object()' בו הקצינו ערכי null לשני המשתנים 'F_name' ו-'L_name'. לאחר מכן, הכרזנו על פונקציה נוספת שאליה העברנו את המשתנים מסוג מחרוזת 'fn' ו-'ln'. בתוך זה, קראנו לשיטת name_set() . לאחר מכן, הכרזנו על שתי פונקציות איבר 'show()' ו-'name_set()'. כאשר הפונקציה 'show() נקראת, היא תציג את השמות הפרטיים ושמות המשפחה ביחד. בעוד שבפונקציית האיברים 'set_name()' העברנו שני משתני מחרוזת מסוג מחרוזת 'fn' ו-'ln', אותם העברנו גם לבנאי השני.



כעת, באמצעות אופרטור ההקצאה להעתקה של המחלקה my_object, אנו לוקחים פרמטר אחד מסוג 'my_object'. המהדר תמיד מצהיר עליו כחבר ציבורי מוטבע בכל מחלקה. בתוך חבר זה, הקצינו את src.F_name ל-'F_name' ואת src.L_name ל-'L_name' ששמרנו על העותק של ה-'F_name' ו-'L_name'. זה מועבר לחברי הכיתה my_object. כעת, הכרזנו על אובייקט מהמחלקה my_cobject בשם 'name1' אליו העברנו שתי מחרוזות 'אנה' ו-'smith' כטיעון. זה יקרא לבנאי ויציג את השם הפרטי יחד עם שם המשפחה.





לאחר מכן, יצרנו אובייקט נוסף 'name2' ולאחר מכן הקצינו את השם לאובייקט זה בנפרד. לאחר העברת ערכים לבנאי עבור שני האובייקטים, קראנו לשיטת show() אשר תציג את השמות של שני האובייקטים 'nam1' ו-'name2'. בסוף הקוד, החזרנו את הערך null והפעלנו את הקוד שלנו.

לִכלוֹל
מעמד האובייקט_ שלי {
פְּרָטִי :
סטד :: חוּט F_name, L_name ;
פּוּמְבֵּי :
האובייקט_ שלי ( ) { F_name = '' ; L_name = '' ; }
האובייקט_ שלי ( סטד :: חוּט fn, std :: חוּט ב ) {
שם_סט ( fn, ln ) ;
}
בָּטֵל הופעה ( ) { סטד :: cout << 'השם הוא ' << F_name << '' << L_name << '. \n ' ; }
בָּטֵל שם_סט ( סטד :: חוּט fn, std :: חוּט ב ) { F_name = fn ; L_name = ב ; }
האובייקט_ שלי & מַפעִיל = ( const האובייקט_ שלי & src ) {
F_name = src. F_name ;
L_name = src. L_name ;
לַחֲזוֹר * זֶה ;
}

} ;
int רָאשִׁי ( int argc, לְהַשְׁחִיר ** argv ) {
שם האובייקט_שלי1 ( 'אנה' , 'נַפָּח' ) ;
שם_האובייקט שלי2 ;
שם2 = ( 'אנה' , 'נַפָּח' ) ;
שם 1. הופעה ( ) ;
שם2. הופעה ( ) ;
לַחֲזוֹר 0 ;
}

לאחר ביצוע הקוד שלנו, יש לנו שגיאה זו שמציגה שכתבנו את הקוד השגוי בשורה 24 המציינת את סוג השגיאה שנתקל בה 'שגיאה: אין התאמה ל'מפעיל=''. כעת, ננסה לפתור את השגיאה הזו.



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

int רָאשִׁי ( int argc, לְהַשְׁחִיר ** argv ) {

שם האובייקט_שלי1 ( 'אנה' , 'נַפָּח' ) ;
שם_האובייקט שלי2 ;
שם2 = שם 1 ;
שם 1. הופעה ( ) ;
שם2. הופעה ( ) ;

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

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

int רָאשִׁי ( int argc, לְהַשְׁחִיר ** argv ) {

שם האובייקט_שלי1 ( 'אנה' , 'נַפָּח' ) ;
שם_האובייקט שלי2 ;
שם2 = האובייקט_ שלי ( 'ג'ון סמית' ) ;

שם 1. הופעה ( ) ;
שם2. הופעה ( ) ;

לאחר ביצוע הקוד שנוסף לעיל, יש לנו את הפלט כפי שמוצג להלן. עבור האובייקט 'name1', הוא הציג את השם 'Anna smith' ועבור האובייקט השני 'name2' הוא הציג את 'Jhone Smith'. אבל הפעם הקוד שלנו עבד כמו שצריך בלי שום שגיאות בו.

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

int רָאשִׁי ( int argc, לְהַשְׁחִיר ** argv ) {
שם האובייקט_שלי1 ( 'אנה' , 'נַפָּח' ) ;
שם_האובייקט שלי2 ( 'ג'ון סמית' ) ;
שם 1. הופעה ( ) ;
שם2. הופעה ( ) ;

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

סיכום

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