שגיאה: לא ניתן ליצור את הכיתה המופשטת

Sgy H L Nytn Lyzwr T Hkyth Hmwpstt



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

תחביר

הודעת השגיאה של השגיאה שלנו היא כדלקמן:

שְׁגִיאָה : לא יכול להכריז על המשתנה '' שהוא מסוג מופשט ''

שימו לב שבסוגריים ריק, יהיו שמות מחלקות משתנים ומופשטים.







שגיאה C2259 : 'מדינה' : לא יכול ליצור מחלקה מופשטת

זוהי הודעה נוספת שאנו מקבלים מהקומפיילר כאשר אנו נתקלים בשגיאה כזו.



דוגמה מס' 01:

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



#include

באמצעות מרחב שמות std ;
מחלקה ShapeClass
{
פּוּמְבֵּי :
וירטואלי int גטריה ( ) = 0 ;
בָּטֵל setWidth ( int ב )
{
רוֹחַב = ב ;
}
בָּטֵל setHeight ( int ח )
{
גוֹבַה = ח ;
}
מוּגָן :
int רוֹחַב ;
int גוֹבַה ;
} ;
int רָאשִׁי ( בָּטֵל )
{
ShapeClasssh ;
ש. setWidth ( 1 ) ;
ש. setHeight ( שתיים ) ;
cout << 'שטח מלבן כולל:' << ש. גטריה ( ) << endl ;
לַחֲזוֹר 0 ;
}

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





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



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

דוגמה מס' 02:

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

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

#include

באמצעות מרחב שמות std ;
class AbsClass
{
פּוּמְבֵּי :
וירטואלי int VirtFunc ( ) = 0 ;
בָּטֵל valueFunc ( int ב )
{
רוֹחַב = ב ;
cout << 'ערך עבר באמצעות אובייקט' << ב << endl ;
}
מוּגָן :
int רוֹחַב ;
} ;
כיתה ChildClass :
AbsClass ציבורי
{
פּוּמְבֵּי :
int VirtFunc ( ) {
cout << 'בתפקוד וירטואלי' << endl ;
}
} ;
int רָאשִׁי ( בָּטֵל )
{
ChildClass cc ;
cc. valueFunc ( 5 ) ;
cout << cc. VirtFunc ( ) << endl ;
לַחֲזוֹר 0 ;
}

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

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

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

סיכום

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