גישה לאיברי האב
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C של Coddy. שיעור 30 מתוך 61.
עכשיו, כשאנחנו מבינים הטמעת struct ואת כלל האיבר הראשון, נתמקד בצד המעשי: איך לקרוא ולשנות את הנתונים של ההורה המוטמע מתוך פונקציה.
כאשר פונקציה מקבלת מבנה Child (או מצביע אליו), כדי לגשת לחברים של ההורה צריך לנווט דרך המבנה המשובץ. התחביר תלוי בשאלה אם עובדים עם ערך או עם מצביע.
typedef struct {
int id;
int score;
} Parent;
typedef struct {
Parent parent;
char grade;
} Child;בעזרת מצביע ל־Child, השתמשו באופרטור החץ כדי להגיע להורה, ואז בנקודה כדי לגשת לאיברים שלו:
void update_score(Child* c, int new_score) {
c->parent.score = new_score; // חץ ואז נקודה
}
void print_info(Child* c) {
printf("ID: %d, Score: %d\n", c->parent.id, c->parent.score);
}עם ערך (שמועבר בהעתקה), השתמשו בנקודות לאורך כל הדרך:
void show_id(Child c) {
printf("ID: %d\n", c.parent.id); // נקודה ואז נקודה
}תבנית הגישה המשורשרת הזו, child->parent.member או child.parent.member, היא הדרך שבה ניגשים לנתונים שעברו בירושה במודל ההרכבה של C. היא מעט מפורטת יותר מירושה אמיתית, אך הקשר בין הטיפוסים מפורש וברור.
אתגר
קלבואו נבנה מערכת ציונים לתלמידים שמדגימה כיצד לגשת לנתונים ולשנות אותם בתוך מבנה משובץ. תיצרו היררכיה שבה Student מכיל Person משובץ, ואז תכתבו פונקציות שפועלות עם הנתונים של המבנה האב דרך המבנה הבן.
תארגנו את הקוד שלכם בשלושה קבצים:
student.h: הגדירו את היררכיית המבנים שלכם עם מגיני הכללה. צרו מבנהPersonעםname(מערך תווים באורך 50 תווים) ועםage(מספר שלם). לאחר מכן הגדירו מבנהStudentשמשבץ אתPersonכחבר הראשון שלו ומוסיף שדהgrade(מספר שלם שמייצג את הציון). הצהירו על שתי פונקציות:set_person_ageשמקבלתStudent*וערך גיל חדש, ו-print_studentשמקבלתStudent*ומציגה את כל המידע.student.c: ממשו את שתי הפונקציות. הפונקציהset_person_ageשלכם צריכה לשנות את הגיל בתוך מבנהPersonהמשובץ. כאן תתרגלו את תחביר החץ ואז נקודה (s->person.age). הפונקציהprint_studentשלכם צריכה לגשת לכל השדות של האדם המשובץ ושל התלמיד עצמו ולהציג אותם.main.c: צרו משתנהStudentואתחלו את כל השדות שלו. לאחר מכן השתמשו ב-set_person_ageכדי לעדכן את הגיל של האדם המשובץ, וקראו ל-print_studentכדי להציג את התוצאה.
תקבלו ארבעה קלטים: שם התלמיד (מחרוזת), הגיל ההתחלתי שלו (מספר שלם), הציון שלו (מספר שלם), וגיל חדש (מספר שלם שיש לעדכן באמצעות הפונקציה שלכם).
בקובץ הראשי שלכם, צרו את התלמיד עם הערכים ההתחלתיים, ואז קראו ל-set_person_age כדי לשנות את הגיל לערך החדש, ולבסוף קראו ל-print_student כדי להציג את המידע המעודכן.
הפלט שלכם אמור להיראות כך:
Name: Emma
Age: 21
Grade: 85כאשר Emma הוא השם, 21 הוא הגיל המעודכן (לא הגיל ההתחלתי), ו-85 הוא הציון. הלמידה המרכזית כאן היא ניווט בתוך המבנה המשובץ כדי לקרוא את איברי המבנה האב ולשנות אותם.
נסו בעצמכם
#include <stdio.h>
#include <string.h>
#include "student.h"
int main() {
char name[50];
int initial_age, grade, new_age;
// קראו את נתוני הקלט
fgets(name, 50, stdin);
name[strcspn(name, "\n")] = '\0'; // הסירו את תו השורה החדשה
scanf("%d", &initial_age);
scanf("%d", &grade);
scanf("%d", &new_age);
// TODO: צרו משתנה מסוג Student
// TODO: אתחלו את כל השדות של הסטודנט
// - העתיקו את name לשם של האדם המוטמע באמצעות strcpy
// - הגדירו את גיל האדם המוטמע ל־initial_age
// - הגדירו את הציון של הסטודנט
// TODO: קראו ל־set_person_age כדי לעדכן את הגיל ל־new_age
// TODO: קראו ל־print_student כדי להציג את התוצאה
return 0;
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4כימוס
המושג של מצביעים אטומיםהגדרת מבנים אטומיםפונקציות Get ו-Setאימות ב-Settersסיכום: הקופסה הסודית2אובייקטים ומתודות
מבנים כאובייקטיםמצביע 'Self'נכונות constמצביע לעומת ערךמתודות עזרחזרה: מנהל נקודות5פרויקט: חשבון בנק פשוט
הגדרת הפרויקטמימוש החשבוןתרגלו בעצמכם: קומפיילר C אונליין