מבנים כאובייקטים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C של Coddy. שיעור 6 מתוך 61.
בשפות מונחות עצמים, אובייקט הוא ישות שאורזת נתונים (מצב) יחד עם פונקציות שפועלות על אותם נתונים (מתודות). ל־C אין אובייקטים מובנים, אבל אפשר לממש את אותו רעיון באמצעות מבנים ופונקציות.
חשוב על struct כחלק ה״נתונים״ של אובייקט. הוא מכיל את המצב: הערכים שמגדירים מה האובייקט הוא כרגע:
typedef struct {
int value;
} Counter;
המבנה Counter מייצג ישות עם פריט מצב יחיד: הערך הנוכחי שלה. כדי להקנות לו התנהגות, נכתוב פונקציות שמקבלות את המבנה כפרמטר:
void counter_increment(Counter *c) {
c->value++;
}
int counter_get(Counter *c) {
return c->value;
}
הפונקציות האלה פועלות כמו מתודות. הן פועלות במיוחד על נתוני Counter. כשמעבירים את המבנה לפונקציות, אנחנו מדמים את מה ששפות אחרות עושות באופן אוטומטי כשקוראים ל־counter.increment().
int main() {
Counter my_counter = {0};
counter_increment(&my_counter);
printf("%d\n", counter_get(&my_counter)); // מדפיס: 1
return 0;
}
מוסכמת השמות typename_action (כמו counter_increment) עוזרת לארגן את הקוד שלך ומבהירה לאיזה מבנה שייכת פונקציה. הדפוס הזה הוא הבסיס לתכנות מונחה עצמים ב-C.
אתגר
קלבואו נבנה מודול Counter פשוט שמתייחס למבנה כאובייקט בעל התנהגות. תארגנו את הקוד שלכם בשלושה קבצים כדי לתרגל את הדפוס של איגוד נתונים עם פונקציות שפועלות עליהם.
תיצרו שלושה קבצים:
counter.h: קובץ הכותרת שלכם, שבו תצהירו על המבנהCounterעם איבר יחיד מסוגint value. כמו כן, הצהירו על שתי פונקציות שמתפקדות כ״מתודות״ של המונה:counter_increment(מקבלת מצביע ל-Counter ומגדילה את הערך שלו ב-1) ו-counter_get(מקבלת מצביע ל-Counter ומחזירה את הערך הנוכחי שלו). השתמשו בשומרי הכללה עם הסמלCOUNTER_H.counter.c: קובץ המקור שלכם, שבו תממשו את שתי הפונקציות. זכרו לכלול את קובץ הכותרת שלכם.main.c: הקובץ הראשי שלכם, שבו תיצרו Counter, תבצעו עליו פעולות ותציגו את התוצאות.
תקבלו שני קלטים של מספרים שלמים: הערך ההתחלתי של המונה שלכם ומספר הפעמים שיש להגדיל אותו.
בקובץ הראשי שלכם, אתחלו Counter עם הערך ההתחלתי, ואז קראו ל-counter_increment את מספר הפעמים שצוין. לבסוף, השתמשו ב-counter_get כדי לקבל ולהדפיס את הערך הסופי.
הדפיסו את התוצאה בפורמט הזה:
Final value: {result}לדוגמה, עם ערך התחלתי של 5 ו-3 הגדלות, הפלט יהיה:
Final value: 8נסו בעצמכם
#include <stdio.h>
#include "counter.h"
int main() {
// קראו את הקלט
int starting_value;
int num_increments;
scanf("%d", &starting_value);
scanf("%d", &num_increments);
// TODO: צרו Counter ואתחלו אותו עם starting_value
// TODO: קראו ל-counter_increment מספר הפעמים שצוין
// TODO: השתמשו ב-counter_get כדי לקבל את הערך הסופי ולהדפיס אותו
// פורמט ההדפסה: "Final value: {result}"
return 0;
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4כימוס
המושג של מצביעים אטומיםהגדרת מבנים אטומיםפונקציות Get ו-Setאימות ב-Settersסיכום: הקופסה הסודית2אובייקטים ומתודות
מבנים כאובייקטיםמצביע 'Self'נכונות constמצביע לעומת ערךמתודות עזרחזרה: מנהל נקודות5פרויקט: חשבון בנק פשוט
הגדרת הפרויקטמימוש החשבוןתרגלו בעצמכם: קומפיילר C אונליין