הטמעת מבנים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C של Coddy. שיעור 28 מתוך 61.
בשפות מונחות עצמים כמו C++ או Java, ירושה מאפשרת למחלקה לקבל מאפיינים ממחלקת אב. ל-C אין ירושה מובנית, אבל אפשר לדמות אותה באמצעות טכניקה שנקראת הרכבה: הצבת מבנה אחד בתוך מבנה אחר.
הרעיון פשוט: אם Child זקוק לכל המאפיינים של Parent, אנחנו מטמיעים את המבנה Parent כחבר ב־Child.
typedef struct {
int id;
char name[50];
} Parent;
typedef struct {
Parent parent; // מבנה נתונים מוטמע
int grade;
} Child;כאן, Child מכיל את כל מה שיש ב־Parent, וגם את שדה ה־grade שלו. זוהי הרכבה: לילד "יש" הורה, במקום שהוא "יהיה" הורה, אבל ההשפעה דומה לירושה.
כדי לגשת לאיברים של ההורה דרך מופע של הילד, משתמשים באופרטור הנקודה פעמיים:
Child c;
c.parent.id = 101;
c.parent.name[0] = 'A';
c.grade = 5;תבנית זו מהווה את הבסיס לבניית היררכיות טיפוסים ב-C. באמצעות הטמעת מבנה בסיסי כאיבר הראשון, אנחנו פותחים בפנינו טכניקות עוצמתיות שנחקור בשיעורים הבאים.
אתגר
קלבואו נבנה מערכת פשוטה לניהול עובדים שמדגימה הטמעת מבנים: הבסיס של ירושה ב-C.
תיצרו היררכיה שבה Employee מכיל Person. הדבר מדמה את אופן פעולתה של ירושה: עובד הוא אדם עם מידע נוסף הקשור לעבודה. על ידי הטמעת המבנה Person בתוך Employee, תקבלו את כל המאפיינים של האדם, בתוספת השדות הייחודיים לעובד.
תארגנו את הקוד שלכם בשלושה קבצים:
types.h: הגדירו כאן את שני המבנים עם guards למניעת הכללה כפולה. תחילה, צרו מבנהPersonעם שני שדות:name(מערך תווים באורך 50 תווים) ו-age(מספר שלם). לאחר מכן הגדירו מבנהEmployeeשמטמיע אתPersonכחבר הראשון שלו ומוסיף שדהemployee_id(מספר שלם).types.c: מימשו פונקציה בשםprint_employeeשמקבלת מצביע אלEmployeeומדפיסה את המידע עליו. גשו לנתוני האדם שהוטמע באמצעות תחביר השרשור של נקודה/חץ שלמדתם.main.c: צרו משתנה מסוגEmployee, אתחלו את כל השדות שלו (כולל השם והגיל של האדם שהוטמע), והשתמשו בפונקציית ההדפסה שלכם כדי להציג את המידע.
תקבלו שלוש קלטים: name של העובד (מחרוזת), age שלו (מספר שלם) ו-employee ID שלו (מספר שלם).
הפונקציה print_employee שלכם צריכה להציג את פרטי העובד בפורמט הזה:
Employee: Alice
Age: 28
ID: 1001כאשר Alice הוא השם, 28 הוא הגיל, ו-1001 הוא מספר העובד מתוך הקלטים שלכם.
זכרו לגשת לחברי המבנה שהוטמע דרך החבר של המבנה ההורה. לדוגמה, כדי להגיע לשם, תעברו תחילה דרך החבר person.
נסו בעצמכם
#include <stdio.h>
#include <string.h>
#include "types.h"
int main() {
// קראו את הקלט
char name[50];
int age;
int employee_id;
fgets(name, 50, stdin);
name[strcspn(name, "\n")] = '\0'; // הסירו את תו ירידת השורה
scanf("%d", &age);
scanf("%d", &employee_id);
// TODO: צרו משתנה מסוג Employee
// TODO: מלאו את השם והגיל של האדם המשובץ
// רמז: השתמשו ב-strcpy עבור השם, וגשו אליו באמצעות employee.person.name
// TODO: הגדירו את employee_id
// TODO: קראו ל-print_employee עם מצביע לעובד שיצרתם
return 0;
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4כימוס
המושג של מצביעים אטומיםהגדרת מבנים אטומיםפונקציות Get ו-Setאימות ב-Settersסיכום: הקופסה הסודית2אובייקטים ומתודות
מבנים כאובייקטיםמצביע 'Self'נכונות constמצביע לעומת ערךמתודות עזרחזרה: מנהל נקודות5פרויקט: חשבון בנק פשוט
הגדרת הפרויקטמימוש החשבוןתרגלו בעצמכם: קומפיילר C אונליין