סקירת הפרויקט
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C של Coddy. שיעור 44 מתוך 61.
אתגר
קלבואו נניח את היסודות לפרויקט Shape Drawer באמצעות יצירת מבנה הבסיס Shape: ממשק שמגדיר מה כל צורה יכולה לעשות באמצעות מצביעי פונקציות.
תיצרו שני קבצים כדי להגדיר את המערכת הפולימורפית הזאת:
shape.h: הגדירו כאן את הממשק המרכזי. תחילה, צרו הצהרה מקדימה עבור המבנהShape. לאחר מכן הגדירו שני טיפוסים של מצביעי פונקציות:DrawFunc: מקבל פרמטר מסוגconst Shape*ואינו מחזיר ערךAreaFunc: מקבל פרמטר מסוגconst Shape*ומחזיר ערך מסוגdouble
Shapeעצמו, המכיל שני מצביעי פונקציות:draw(מטיפוסDrawFunc) ו-area(מטיפוסAreaFunc). המבנה הזה משמש כממשק בלבד. הוא אינו מכיל נתונים ייחודיים לצורה, אלא רק התנהגות.main.c: הדגימו שהממשק שלכם פועל באמצעות יצירת צורת בדיקה פשוטה. ממשו שתי פונקציות:test_draw: מדפיסהDrawing test shapetest_area: מחזירה42.0
Shape, חברו אותו לפונקציות הבדיקה האלה, ואז קראו לשתיהן דרך הממשק. הדפיסו את תוצאת השטח עם ספרה אחת אחרי הנקודה העשרונית.
הפלט שלכם צריך להדגים שמצביעי הפונקציות פועלים כראוי:
Drawing test shape
Area: 42.0למה צריך הצהרה מקדימה? אולי אתם תוהים למה typedef struct Shape Shape; מופיעה לפני שהמבנה מוגדר במלואו. הדבר נחוץ מכיוון ש-DrawFunc ו-AreaFunc מפנים אל const Shape* בסוגי הפרמטרים שלהם, אך בנקודה הזאת בקובץ, המהדר עדיין לא ראה את ההגדרה המלאה של המבנה. ההצהרה המקדימה אומרת למהדר: "קיים מבנה בשם Shape", וזה מספיק כדי להשתמש במצביע אליו. ההגדרה המלאה מופיעה בהמשך. זהו דפוס נפוץ ב-C בכל פעם שמבנה צריך להפנות לעצמו (ישירות או באמצעות מצביעי פונקציות).
התובנה המרכזית כאן היא ש-Shape אינו יודע דבר על מעגלים או מלבנים. הוא רק יודע שכל צורה חייבת להיות מסוגלת draw את עצמה ולחשב את ה-area שלה. בשיעורים הבאים תיצרו צורות ממשיות שישלבו את מבנה הבסיס הזה ויספקו מימושים משלהן. זכרו להשתמש בשומרי הכללה בקובץ הכותרת שלכם.
נסו בעצמכם
#include <stdio.h>
#include "shape.h"
// TODO: לממש את הפונקציה test_draw
// - מקבלת פרמטר מסוג const Shape*
// - מדפיסה "Drawing test shape"
void test_draw(const Shape* shape) {
// TODO: להדפיס את ההודעה הנדרשת
}
// TODO: לממש את הפונקציה test_area
// - מקבלת פרמטר מסוג const Shape*
// - מחזירה 42.0
double test_area(const Shape* shape) {
// TODO: להחזיר את ערך שטח הבדיקה
}
int main() {
// TODO: ליצור מופע של Shape
// TODO: לחבר את הצורה לפונקציות test_draw ו-test_area
// TODO: לקרוא ל-draw דרך הממשק
// TODO: לקרוא ל-area דרך הממשק ולהדפיס עם ספרה אחת אחרי הנקודה העשרונית
// פורמט: "Area: %.1f\n"
return 0;
}
כל השיעורים ביחידה תכנות מונחה עצמים
4כימוס
המושג של מצביעים אטומיםהגדרת מבנים אטומיםפונקציות Get ו-Setאימות ב-Settersסיכום: הקופסה הסודית2אובייקטים ומתודות
מבנים כאובייקטיםמצביע 'Self'נכונות constמצביע לעומת ערךמתודות עזרחזרה: מנהל נקודות5פרויקט: חשבון בנק פשוט
הגדרת הפרויקטמימוש החשבוןתרגלו בעצמכם: קומפיילר C אונליין