הצהרת מצביעים לפונקציות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C של Coddy. שיעור 33 מתוך 61.
עד כה למדנו לדמות ירושה באמצעות הטמעת struct. אבל פולימורפיזם אמיתי, שבו אובייקטים שונים מגיבים באופן שונה לאותה קריאה, דורש משהו נוסף: מצביעי פונקציות.
מצביע לפונקציה הוא משתנה שמאחסן את הכתובת של פונקציה. בדומה למצביע רגיל שמחזיק את הכתובת של נתונים, מצביע לפונקציה מחזיק את הכתובת של קוד בר־ביצוע.
התחביר עשוי להיראות מאיים בהתחלה. כדי להצהיר על מצביע לפונקציה, מציינים את טיפוס הערך המוחזר, לאחר מכן את שם המצביע בסוגריים עם כוכבית, ואחריו את טיפוסי הפרמטרים:
int (*operation)(int, int);כך מצהירים על משתנה בשם operation שיכול להצביע על כל פונקציה שמקבלת שני פרמטרים מסוג int ומחזירה int. הסוגריים סביב *operation חיוניים; בלעדיהם, היית מצהיר על פונקציה שמחזירה מצביע.
כדי לשייך פונקציה למצביע הזה, פשוט השתמש בשם הפונקציה (ללא סוגריים):
int add(int a, int b) {
return a + b;
}
int (*operation)(int, int);
operation = add; // כעת operation מצביע על addשם הפונקציה משמש ככתובת שלה. אפשר גם להשתמש במפורש ב־&add, אבל זה לא חובה: שתי הצורות שקולות ב־C.
אתגר
קלבואו נתרגל הכרזה על מצביעים לפונקציות והשמת פונקציות בהם. תיצור מערכת פשוטה לפעולות מתמטיות, שבה מצביע לפונקציה יכול להצביע על פונקציות חשבוניות שונות.
כתוב תוכנית ש:
- מגדירה שתי פונקציות:
multiply: מקבלת שני פרמטרים מסוגintומחזירה את המכפלה שלהםsubtract: מקבלת שני פרמטרים מסוגintומחזירה את הראשון פחות השני
- בתוך
main, מכריזה על משתנה מצביע לפונקציה בשםoperation, שיכול להצביע על פונקציות המקבלות שני פרמטרים מסוגintומחזירותint - קוראת שלוש קלטים: שני מספרים שלמים וקוד פעולה (1 עבור כפל, 2 עבור חיסור)
- על סמך קוד הפעולה, משייכת את הפונקציה המתאימה למצביע
operationשלך - מדפיסה את שם הפעולה המשויכת, ואז מדפיסה את התוצאה של קריאה לפונקציה דרך המצביע
תקבל שלושה קלטים: המספר הראשון, המספר השני וקוד הפעולה (1 או 2).
הפלט שלך אמור להיראות כך:
Operation: multiply
Result: 35כאשר multiply הוא שם הפעולה (או subtract אם הקוד הוא 2), ו-35 היא התוצאה של קריאה לפונקציה דרך המצביע שלך (במקרה הזה, 5 × 7).
זכור: כדי להכריז על מצביע לפונקציה, צריך לציין את סוג הערך המוחזר, את שם המצביע בסוגריים עם כוכבית, ואת סוגי הפרמטרים. כדי לשייך פונקציה, השתמש רק בשם הפונקציה ללא סוגריים.
נסו בעצמכם
#include <stdio.h>
// TODO: הגדירו כאן את הפונקציה multiply
// TODO: הגדירו כאן את הפונקציה subtract
int main() {
int num1, num2, code;
// קראו קלט
scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &code);
// TODO: הכריזו על מצביע לפונקציה בשם 'operation' שיכול להצביע על
// פונקציות שמקבלות שני פרמטרים מסוג int ומחזירות ערך מסוג int
// TODO: על סמך קוד הפעולה (1 לכפל, 2 לחיסור),
// הקצו למצביע הפעולה את הפונקציה המתאימה
// TODO: הדפיסו את שם הפעולה ואת התוצאה
// פורמט:
// Operation: <name>
// Result: <result>
return 0;
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4כימוס
המושג של מצביעים אטומיםהגדרת מבנים אטומיםפונקציות Get ו-Setאימות ב-Settersסיכום: הקופסה הסודית7מצביעים לפונקציות
הצהרת מצביעים לפונקציותקריאה למצביעים לפונקציותשימוש ב-typedef עבור מצביעים לפונקציותהעברת פונקציות כארגומנטיםסיכום: ניתוב במחשבון2אובייקטים ומתודות
מבנים כאובייקטיםמצביע 'Self'נכונות constמצביע לעומת ערךמתודות עזרחזרה: מנהל נקודות5פרויקט: חשבון בנק פשוט
הגדרת הפרויקטמימוש החשבוןתרגלו בעצמכם: קומפיילר C אונליין